#!/usr/bin/env python3
"""Summarize paired robustness backtests without exposing embedded configs."""

from __future__ import annotations

import argparse
import hashlib
import json
import zipfile
from pathlib import Path


BASELINE = "VolatilityBreakoutRiskCapMatchedBaseline"
CANDIDATE = "VolatilityBreakoutRiskCapAdxScaledRisk"


def sha256(path: Path) -> str:
    digest = hashlib.sha256()
    with path.open("rb") as handle:
        for chunk in iter(lambda: handle.read(1024 * 1024), b""):
            digest.update(chunk)
    return digest.hexdigest()


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


def metrics(item: dict) -> dict:
    return {
        "timerange": item["timerange"],
        "trades": item["total_trades"],
        "longs": item["trade_count_long"],
        "shorts": item["trade_count_short"],
        "return": item["profit_total"],
        "profitFactor": item["profit_factor"],
        "maxDrawdown": item["max_drawdown_account"],
        "winRate": item["winrate"],
        "averageStake": item["avg_stake_amount"],
        "timeframe": item["timeframe"],
        "protections": item["enable_protections"],
    }


def main() -> int:
    parser = argparse.ArgumentParser()
    parser.add_argument("root", type=Path)
    parser.add_argument("output", type=Path)
    args = parser.parse_args()

    rows = []
    for path in sorted(args.root.rglob("*.zip")):
        strategies = load(path)
        if BASELINE not in strategies or CANDIDATE not in strategies:
            continue
        base = metrics(strategies[BASELINE])
        candidate = metrics(strategies[CANDIDATE])
        rows.append(
            {
                "case": str(path.parent.relative_to(args.root)),
                "archive": str(path),
                "archiveSha256": sha256(path),
                "baseline": base,
                "candidate": candidate,
                "delta": {
                    "return": candidate["return"] - base["return"],
                    "profitFactor": candidate["profitFactor"] - base["profitFactor"],
                    "maxDrawdown": candidate["maxDrawdown"] - base["maxDrawdown"],
                },
            }
        )
    args.output.write_text(json.dumps(rows, indent=2) + "\n", encoding="utf-8")
    print(json.dumps({"cases": len(rows), "output": str(args.output)}))
    return 0


if __name__ == "__main__":
    raise SystemExit(main())
