from __future__ import annotations

import json
from pathlib import Path

from src.tools.hl_reconcile_watchdog import assess
from src.tools import v76_paper_supervisor


def test_reconcile_watchdog_blocks_position_without_stop():
    result = assess({
        "env": "mainnet",
        "private_key_used": False,
        "positions": {"BTC": {"szi": "0.01"}},
        "open_orders": [],
        "alerts": ["position_without_stop:BTC"],
        "stops_missing_count": 1,
        "block_new_entries": True,
    })
    assert result["critical"] is True
    assert result["block_new_entries"] is True


def test_reconcile_watchdog_allows_clean_readonly_snapshot():
    result = assess({
        "env": "mainnet",
        "private_key_used": False,
        "status": "ok",
        "positions": {},
        "open_orders": [],
        "alerts": [],
        "stops_missing_count": 0,
        "block_new_entries": False,
    })
    assert result["status"] == "ok"
    assert result["block_new_entries"] is False


def test_reconcile_watchdog_blocks_skipped_or_failed_reconcile():
    result = assess({"env": "mainnet", "status": "skipped", "reason": "env_load_failed", "positions": {}, "open_orders": []})
    assert result["critical"] is True
    assert result["block_new_entries"] is True


def test_paper_supervisor_refuses_start_when_reconcile_critical(monkeypatch, tmp_path):
    monkeypatch.chdir(tmp_path)
    monkeypatch.setattr(v76_paper_supervisor, "_load_json_from_reconcile", lambda env: {"env": env, "alerts": ["position_without_stop:BTC"], "stops_missing_count": 1, "block_new_entries": True, "positions": {"BTC": {}}, "open_orders": []})
    monkeypatch.setattr(v76_paper_supervisor, "supervisor_status", lambda strategies: {s: {"running": False, "env_ok": False} for s in strategies})
    payload = v76_paper_supervisor.ensure_running([v76_paper_supervisor.STRICT_ID], iterations=1, interval_seconds=1, coins="BTC")
    assert payload["status"] == "blocked"
    assert payload["started"] == []
    assert payload["mainnet_signed_action"] is False
