from __future__ import annotations

import json
from pathlib import Path

from src.tools import v76_paper_supervisor
from src.tools.v76_paper_runtime import STRICT_ID


def _append(path: Path, row: dict) -> None:
    path.parent.mkdir(parents=True, exist_ok=True)
    with path.open("a", encoding="utf-8") as fh:
        fh.write(json.dumps(row) + "\n")


def test_v76_supervisor_status_includes_lifecycle_summary(tmp_path, monkeypatch):
    monkeypatch.setattr(v76_paper_supervisor, "_repo_root", lambda: tmp_path)
    runtime = tmp_path / "runtime" / "experiments" / STRICT_ID
    _append(runtime / "trade_journal.jsonl", {"event": "entry", "coin": "BTC", "live_order_allowed": False, "mainnet_signed_action": False})
    _append(runtime / "trade_journal.jsonl", {"event": "exit", "coin": "BTC", "exit_reason": "take_profit", "net_pnl_usd": "0.42", "live_order_allowed": False, "mainnet_signed_action": False})
    _append(runtime / "trade_journal.jsonl", {"event": "exit", "coin": "ETH", "exit_reason": "stop_loss", "net_pnl_usd": "-0.21", "live_order_allowed": False, "mainnet_signed_action": False})
    _append(runtime / "signal_journal.jsonl", {"final_decision": "blocked:cost", "block_reason": ["cost", "confluence_block_new_entry"]})
    (runtime / "state.json").write_text(json.dumps({"open_positions": {"ETH": {"entry": "100", "size": "0.2"}}}))

    summary = v76_paper_supervisor._lifecycle_summary(STRICT_ID)

    assert summary["entries"] == 1
    assert summary["exits"] == 2
    assert summary["open_positions"] == 1
    assert summary["open_by_coin"] == {"ETH": 1}
    assert summary["open_notional_usd"] == "20.00"
    assert summary["exit_reasons"] == {"take_profit": 1, "stop_loss": 1}
    assert summary["closed_net_pnl_usd"] == "0.21"
    assert summary["winrate_pct"] == "50.00"
    assert summary["profit_factor"] == "2.00"
    assert summary["recent_signal_blockers"]["cost"] == 1
    assert summary["recent_signal_blockers"]["blocked"] == 1
    assert summary["trade_journal_meta"]["exists"] is True
    assert summary["signal_journal_meta"]["exists"] is True
    assert summary["paper_only"] is True


def test_v76_supervisor_detects_unexpected_live_flag(tmp_path, monkeypatch):
    monkeypatch.setattr(v76_paper_supervisor, "_repo_root", lambda: tmp_path)
    runtime = tmp_path / "runtime" / "experiments" / STRICT_ID
    _append(runtime / "trade_journal.jsonl", {"event": "exit", "coin": "BTC", "exit_reason": "stop_loss", "net_pnl_usd": "-0.12", "live_order_allowed": True})

    summary = v76_paper_supervisor._lifecycle_summary(STRICT_ID)

    assert summary["live_flags"] == 1
    assert summary["paper_only"] is False
