#!/usr/bin/env python3
"""Retain only review-grade tables and metrics from a Callme heavy tune run."""

import argparse
import csv
import json
import shutil
import time
from pathlib import Path


def read_csv(path):
    with Path(path).open("r", encoding="utf-8", newline="") as fp:
        return list(csv.DictReader(fp))


def write_csv(path, rows):
    path = Path(path)
    path.parent.mkdir(parents=True, exist_ok=True)
    if not rows:
        path.write_text("", encoding="utf-8")
        return
    with path.open("w", encoding="utf-8", newline="") as fp:
        writer = csv.DictWriter(fp, fieldnames=list(rows[0].keys()))
        writer.writeheader()
        writer.writerows(rows)


def read_json(path):
    path = Path(path)
    if not path.exists():
        return None
    return json.loads(path.read_text(encoding="utf-8"))


def write_json(path, data):
    path = Path(path)
    path.parent.mkdir(parents=True, exist_ok=True)
    path.write_text(json.dumps(data, indent=2, ensure_ascii=False) + "\n", encoding="utf-8")


def score_key(row):
    return (
        float(row.get("net_pct") or -999999),
        float(row.get("pf") or 0),
        float(row.get("max_mtm_dd_pct") or -999999),
    )


def main():
    ap = argparse.ArgumentParser()
    ap.add_argument("--out-dir", required=True)
    ap.add_argument("--top-per-group", type=int, default=25)
    ap.add_argument("--coord-dir", default="")
    args = ap.parse_args()

    out_dir = Path(args.out_dir)
    groups_dir = out_dir / "groups"
    kept = []
    removed = []
    top_rows = []

    if groups_dir.exists():
        for path in sorted(groups_dir.glob("*/candidate_summary.csv")):
            rows = read_csv(path)
            rows.sort(key=score_key, reverse=True)
            for row in rows[: args.top_per_group]:
                row["source_group_dir"] = path.parent.name
                top_rows.append(row)
        write_csv(out_dir / "group_top_metrics.csv", top_rows)
        kept.append("group_top_metrics.csv")
        shutil.rmtree(groups_dir)
        removed.append("groups/")

    for name in [
        "all_signal_backtest_trades.csv",
    ]:
        path = out_dir / name
        if path.exists():
            path.unlink()
            removed.append(name)

    for name in [
        "summary.json",
        "selected_group_configs.csv",
        "group_top_metrics.csv",
        "REPORT.md",
        "STATUS.json",
    ]:
        if (out_dir / name).exists():
            kept.append(name)

    manifest = {
        "cleaned_at": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()),
        "out_dir": str(out_dir),
        "policy": "heavy tune retention: keep parameter/result tables and metrics only",
        "kept": sorted(set(kept)),
        "removed": removed,
    }
    write_json(out_dir / "RETENTION_MANIFEST.json", manifest)

    if args.coord_dir:
        summary = read_json(out_dir / "summary.json") or {}
        status = read_json(out_dir / "STATUS.json") or {}
        write_json(
            Path(args.coord_dir) / "HEAVY_LAST_RUN.json",
            {
                "run_dir": str(out_dir),
                "state": status.get("state"),
                "cleaned_at": manifest["cleaned_at"],
                "retention_manifest": str(out_dir / "RETENTION_MANIFEST.json"),
                "summary": summary.get("all_signal_summary"),
                "kept": manifest["kept"],
                "removed": manifest["removed"],
            },
        )


if __name__ == "__main__":
    main()
