from __future__ import annotations

import json
from pathlib import Path

from src.tools.tradingview_operational_gates import load_operational_gates, format_operational_gate_report


def _write(path: Path, payload: dict) -> None:
    path.parent.mkdir(parents=True, exist_ok=True)
    path.write_text(json.dumps(payload), encoding="utf-8")


def test_load_operational_gates_all_green_from_runtime_reports(tmp_path):
    _write(tmp_path / "reports" / "hl_reconcile_watchdog_latest.json", {"watchdog": {"critical": False, "block_new_entries": False, "stops_missing_count": 0, "status": "ok"}})
    _write(tmp_path / "reports" / "preflight_evidence_latest.json", {"telegram_alerts_tested": True, "position_without_stop_impossible": True, "testnet_fill_stop": True})
    _write(tmp_path / "config" / "tiny_autonomous_live_limits.json", {"max_daily_loss_usdc": 2, "max_weekly_loss_usdc": 5, "block_new_entries_if": ["daily_loss_exceeded", "weekly_loss_exceeded", "kill_switch_active", "position_without_stop"]})

    gates = load_operational_gates(tmp_path)

    assert gates["gates"] == {
        "reconcile_clean": True,
        "alerts_proven": True,
        "loss_gates_active": True,
        "kill_switch_ready": True,
        "stop_handling_ready": True,
    }
    assert gates["blockers"] == []


def test_load_operational_gates_blocks_dirty_reconcile_and_missing_alerts(tmp_path):
    _write(tmp_path / "reports" / "hl_reconcile_watchdog_latest.json", {"watchdog": {"critical": True, "block_new_entries": True, "stops_missing_count": 1, "status": "critical"}})
    _write(tmp_path / "reports" / "preflight_evidence_latest.json", {"telegram_alerts_tested": False, "position_without_stop_impossible": False, "testnet_fill_stop": False})
    _write(tmp_path / "config" / "tiny_autonomous_live_limits.json", {"block_new_entries_if": []})

    gates = load_operational_gates(tmp_path)

    assert gates["gates"]["reconcile_clean"] is False
    assert gates["gates"]["alerts_proven"] is False
    assert "reconcile_clean_missing" in gates["blockers"]
    assert "alerts_proven_missing" in gates["blockers"]


def test_operational_gate_report_is_short(tmp_path):
    gates = {"gates": {"reconcile_clean": False, "alerts_proven": False}, "blockers": ["reconcile_clean_missing", "alerts_proven_missing"]}

    line = format_operational_gate_report(gates)

    assert line.startswith("Operational Gates:")
    assert "reconcile_clean_missing" in line
