#!/usr/bin/env python3
import json
from pathlib import Path

ROOT = Path(__file__).resolve().parent
d = json.loads((ROOT / "evidence.json").read_text())
trade_by_id = {t["id"]: t for t in d["trades"]}
cases = []

def utc(value):
    if value is None or value.endswith("Z") or "+" in value[10:]:
        return value
    return value.replace(" ", "T") + "+00:00"

for order in d["entry_orders"]:
    trade = trade_by_id[order["ft_trade_id"]]
    closed = not bool(trade["is_open"])
    cases.append({
        "case_id": f"trade-{trade['id']}", "pair": trade["pair"],
        "side": "short" if trade["is_short"] else "long",
        "reference": {"kind": "hindsight_annotation", "present": False, "time": None},
        "strategy_signal": {"present": True, "time": utc(order["order_date"]), "provenance": "inferred_from_real_entry_order"},
        "gate": {"status": "passed", "reason": None},
        "order": {"submitted": True, "time": utc(order["order_date"]), "intended_price": order["price"]},
        "fill": {"filled": True, "time": utc(order["order_filled_date"]), "price": order["average"]},
        "exit": {"present": closed, "time": utc(trade["close_date"]), "reason": trade["exit_reason"], "stop_price": trade["stop_loss"]},
        "closed": closed,
        "outcome": {"pnl_ratio": trade["close_profit"], "mfe_ratio": trade["mfe_ratio_gross"], "mae_ratio": trade["mae_ratio_gross"]},
        "technical_tags": [],
        "evidence": [f"sqlite:orders:{order['id']}", f"sqlite:trades:{trade['id']}"]
    })

for idx, miss in enumerate(d["cancelled_entries"], 1):
    cases.append({
        "case_id": f"cancelled-{idx}", "pair": miss["pair"], "side": miss["side"],
        "reference": {"kind": "hindsight_annotation", "present": False, "time": None},
        "strategy_signal": {"present": True, "time": miss["order_time"], "provenance": "inferred_from_cancelled_freqtrade_entry"},
        "gate": {"status": "passed", "reason": None},
        "order": {"submitted": True, "time": miss["order_time"], "intended_price": miss["intended_rate"]},
        "fill": {"filled": False, "time": None, "price": None},
        "exit": {"present": False, "time": None, "reason": None, "stop_price": None},
        "closed": False, "outcome": {"pnl_ratio": None, "mfe_ratio": None, "mae_ratio": None},
        "technical_tags": ["order_not_filled"],
        "evidence": [f"freqtrade.log:fully_cancelled:{miss['time']}"]
    })

for idx, block in enumerate(d["block_clusters"], 1):
    cases.append({
        "case_id": f"risk-block-{idx}", "pair": block["pair"], "side": block["side"],
        "reference": {"kind": "hindsight_annotation", "present": False, "time": None},
        "strategy_signal": {"present": True, "time": block["time"], "provenance": "entry_blocked_log"},
        "gate": {"status": "blocked", "reason": block["reason"]},
        "order": {"submitted": False, "time": None, "intended_price": None},
        "fill": {"filled": False, "time": None, "price": None},
        "exit": {"present": False, "time": None, "reason": None, "stop_price": None},
        "closed": False, "outcome": {"pnl_ratio": None, "mfe_ratio": None, "mae_ratio": None},
        "technical_tags": ["exposure_block"],
        "evidence": [f"freqtrade.log:entry_blocked:{block['time']}"]
    })

review = {
    "review_id": "2026-08-10-bot1-two-week-order-review",
    "as_of": d["window"]["end"],
    "strategy": {"bot_id": "bot1", "name": "VolatilityBreakoutRiskCap", "version": "5.4.1-d48-riskcap-observe"},
    "window": {"start": d["window"]["start"], "end": d["window"]["end"], "timeframe": "5m"},
    "cases": cases,
}
(ROOT / "review.json").write_text(json.dumps(review, ensure_ascii=False, indent=2))
print(json.dumps({"cases": len(cases), "filled": len(d["entry_orders"]), "cancelled": len(d["cancelled_entries"]), "risk_blocks": len(d["block_clusters"])}, ensure_ascii=False))
