"""The go-live gate. A strategy version only graduates to real money if every check passes."""
import json
import pandas as pd
from .config import STATE
from .metrics import summarize


def evaluate(journal, version, cfg, now=None):
    g = cfg["gate"]
    now = now or pd.Timestamp.now(tz="UTC")
    row = journal.version(version)
    trades = journal.trades(version, "closed")
    s = summarize(trades, row["start_equity"], journal.equity_series(version))
    days = (now - pd.Timestamp(row["created"])).total_seconds() / 86400
    bt = row.get("backtest") or {}
    bt_exp = (bt.get("unseen_test") or bt).get("expectancy_r") if bt else None
    crashes = journal.count_events("CRASH", row["created"])

    checks = [
        ("Enough trades", s["trades"] >= g["min_trades"], f"{s['trades']} / {g['min_trades']}"),
        ("Enough days on demo", days >= g["min_days"], f"{days:.0f} / {g['min_days']} days"),
        ("Profit after fees", s["net_pnl"] > 0, f"{s['net_pnl']:+.2f}"),
        ("Profit factor", s["profit_factor"] >= g["min_profit_factor"], f"{s['profit_factor']} (needs {g['min_profit_factor']}+)"),
        ("Drawdown within limit", s["max_drawdown_pct"] <= g["max_drawdown_pct"], f"{s['max_drawdown_pct']}% (limit {g['max_drawdown_pct']}%)"),
        ("Close to its backtest", bt_exp is not None and s["expectancy_r"] >= bt_exp - g["backtest_tolerance_r"],
         "no backtest on file" if bt_exp is None else f"live {s['expectancy_r']}R vs backtest {bt_exp}R"),
        ("No crashes", crashes <= g["max_crashes"], f"{crashes} crashes"),
    ]
    passed = all(c[1] for c in checks)
    return {"version": version, "passed": passed, "summary": s,
            "checks": [{"name": n, "ok": bool(o), "detail": d} for n, o, d in checks]}


def write_pass_file(result):
    if result["passed"]:
        p = STATE / f"gate_passed_v{result['version']}.json"
        p.write_text(json.dumps(result, indent=2))
        return p
    return None
