from src.tools.preflight import _candidate_promotion_ok, evaluate_live_preview_preflight


def test_preflight_blocks_missing_required_evidence_and_live_flags():
    r = evaluate_live_preview_preflight(evidence={})
    assert r.status == "FAIL"
    for gate in ["tests_green", "compileall_green", "mainnet_readonly_reconcile", "testnet_alo_cancel", "testnet_schedule_cancel", "testnet_fill_stop", "data_quality_gate", "api_health_handled", "v76_net_scorecard_gates", "nonce_manager", "telegram_alerts_tested", "legacy_autotrader_blocked"]:
        assert gate in r.failed_gates
    assert r.recommendation.startswith("BLOCK")


def test_preflight_pass_is_only_permission_to_request_sir_approval(monkeypatch):
    monkeypatch.setenv("CTB_LIVE_TRADING_ALLOWED", "true")
    monkeypatch.setenv("CTB_LIVE_CONFIRMATION", "token")
    evidence = {k: True for k in ["tests_green", "compileall_green", "mainnet_readonly_reconcile", "testnet_alo_cancel", "testnet_schedule_cancel", "testnet_fill_stop", "position_without_stop_impossible", "data_quality_gate", "api_health_handled", "v76_net_scorecard_gates", "nonce_manager", "telegram_alerts_tested", "secrets_scan_clean", "legacy_autotrader_blocked"]}
    r = evaluate_live_preview_preflight(evidence=evidence, expected_confirmation="token")
    assert r.status == "PASS"
    assert "Sir may approve" in r.recommendation


def test_preflight_treats_schedule_cancel_volume_limit_as_conditional(monkeypatch):
    monkeypatch.setenv("CTB_LIVE_TRADING_ALLOWED", "true")
    monkeypatch.setenv("CTB_LIVE_CONFIRMATION", "token")
    evidence: dict[str, object] = {k: True for k in ["tests_green", "compileall_green", "mainnet_readonly_reconcile", "testnet_alo_cancel", "testnet_fill_stop", "position_without_stop_impossible", "data_quality_gate", "api_health_handled", "v76_net_scorecard_gates", "nonce_manager", "telegram_alerts_tested", "secrets_scan_clean", "legacy_autotrader_blocked"]}
    evidence["testnet_schedule_cancel"] = "conditional_unavailable_due_to_exchange_volume_limit"
    r = evaluate_live_preview_preflight(evidence=evidence, expected_confirmation="token")
    assert r.status == "PASS_WITH_CONDITIONAL_SCHEDULECANCEL"
    assert "testnet_schedule_cancel" not in r.failed_gates
    assert r.conditional_gates == ("testnet_schedule_cancel",)


def test_v77_candidate_promotion_gate_requires_non_executing_v2_report():
    report = {
        "schema_version": "v77_promotion_report.v2",
        "strategy_id": "candidate_v77_trend_retest_anti_chase_long",
        "strategy_version": "v77.1.0",
        "promotion_eligible": True,
        "execution_allowed": False,
        "live_order_allowed": False,
        "mainnet_signed_action": False,
    }
    assert _candidate_promotion_ok(report) is True
    assert _candidate_promotion_ok({**report, "live_order_allowed": True}) is False
    assert _candidate_promotion_ok({**report, "strategy_version": "v77.0.0"}) is False
