#!/usr/bin/env python3
"""Compare the frozen 12-pair baseline with the currently active 11-pair universe."""

from __future__ import annotations

import json
import zipfile
from pathlib import Path

import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import pandas as pd


ROOT = Path(__file__).resolve().parents[2]
OUT = Path(__file__).resolve().parent
RUNS = {
    "training": {
        "baseline": ROOT
        / "artifacts/systematic-trading-validation-2026-07-29/baseline-results/backtest-result-2026-07-29_10-44-20-sanitized.zip",
        "active11": OUT / "active-11pairs-training-sanitized.zip",
    },
    "validation": {
        "baseline": ROOT
        / "artifacts/systematic-trading-validation-2026-07-29/baseline-results/backtest-result-2026-07-29_10-45-23-sanitized.zip",
        "active11": OUT / "active-11pairs-validation-sanitized.zip",
    },
}


def load(path: Path) -> dict:
    with zipfile.ZipFile(path) as archive:
        name = next(
            item
            for item in archive.namelist()
            if item.endswith(".json") and not item.endswith(".meta.json")
        )
        return next(iter(json.loads(archive.read(name))["strategy"].values()))


def metrics(result: dict) -> dict:
    return {
        "timerange": result["timerange"],
        "trades": result["total_trades"],
        "return": result["profit_total"],
        "profitFactor": result["profit_factor"],
        "maxDrawdown": result["max_drawdown_account"],
    }


def equity(result: dict) -> pd.Series:
    trades = pd.DataFrame(result["trades"])
    closed = trades.groupby(pd.to_datetime(trades["close_date"], utc=True))["profit_abs"].sum()
    start = pd.Timestamp(result["backtest_start"], tz="UTC")
    return pd.concat([pd.Series({start: result["starting_balance"]}), closed]).sort_index().cumsum()


summary = {}
fig, axes = plt.subplots(1, 2, figsize=(14, 5.5), constrained_layout=True)
for axis, (window, paths) in zip(axes, RUNS.items(), strict=True):
    loaded = {name: load(path) for name, path in paths.items()}
    summary[window] = {name: metrics(result) for name, result in loaded.items()}
    for name, color in (("baseline", "#2563EB"), ("active11", "#D97706")):
        curve = equity(loaded[name])
        label = "12-pair frozen baseline" if name == "baseline" else "11-pair active universe"
        axis.step(curve.index, curve.values, where="post", color=color, linewidth=1.8, label=label)
    base = summary[window]["baseline"]
    active = summary[window]["active11"]
    axis.set_title(
        f"{window.title()}\n"
        f"Return {base['return']:.2%} → {active['return']:.2%}; "
        f"PF {base['profitFactor']:.3f} → {active['profitFactor']:.3f}"
    )
    axis.set_ylabel("Realized wallet (USDT)")
    axis.xaxis.set_major_locator(mdates.AutoDateLocator(minticks=4, maxticks=7))
    axis.xaxis.set_major_formatter(mdates.ConciseDateFormatter(axis.xaxis.get_major_locator()))
    axis.grid(alpha=0.2)
    axis.legend(frameon=False)

fig.suptitle("D48 RiskCap: active-universe change fails the promotion gate", fontsize=15)
fig.savefig(OUT / "active-11pairs-comparison.png", dpi=180)
(OUT / "active-11pairs-summary.json").write_text(
    json.dumps(summary, indent=2, ensure_ascii=False) + "\n", encoding="utf-8"
)
