#!/usr/bin/env python3
"""
Compare market-neutral **prototype** sleeves side-by-side.

Runs sector L/S rotation and pairs stat-arb (or reads existing daily CSVs) and prints
a headline table vs SPY.

Example::

    cd /Users/robzingale/trading_bot && PYTHONUNBUFFERED=1 \\
      .venv/bin/python RenTech/strategy_stack/run_mn_prototype_compare.py \\
      --start 2016-01-04 --end 2026-04-02 --run-all
"""

from __future__ import annotations

import argparse
import json
import subprocess
import sys
from pathlib import Path

import pandas as pd

_REPO = Path(__file__).resolve().parents[2]
if str(_REPO) not in sys.path:
    sys.path.insert(0, str(_REPO))

LOGS = _REPO / "RenTech" / "data" / "logs"
DEFAULT_SECTOR_LS = LOGS / "sector_ls_momentum_standard_daily.csv"
DEFAULT_PAIRS = LOGS / "pairs_statarb_standard_daily.csv"


def _load_meta(path: Path) -> dict:
    meta_path = path.with_name(path.name.replace("_daily.csv", "_meta.json"))
    if meta_path.is_file():
        return json.loads(meta_path.read_text(encoding="utf-8"))
    return {}


def _run(cmd: list[str]) -> None:
    print(f"  $ {' '.join(cmd)}", flush=True)
    subprocess.run(cmd, check=True, cwd=str(_REPO))


def main() -> None:
    ap = argparse.ArgumentParser(description=__doc__.split("\n\n")[0])
    ap.add_argument("--start", default="2016-01-04")
    ap.add_argument("--end", default="2026-04-02")
    ap.add_argument("--capital", type=float, default=100_000.0)
    ap.add_argument("--run-all", action="store_true", help="Regenerate both prototype dailies")
    ap.add_argument("--sector-ls-daily", type=Path, default=DEFAULT_SECTOR_LS)
    ap.add_argument("--pairs-daily", type=Path, default=DEFAULT_PAIRS)
    args = ap.parse_args()

    py = str(_REPO / ".venv/bin/python")
    if args.run_all:
        print("=== Sector L/S rotation ===", flush=True)
        _run(
            [
                py,
                "RenTech/strategy_stack/run_sector_ls_momentum_standard.py",
                "--start",
                args.start,
                "--end",
                args.end,
                "--capital",
                str(args.capital),
            ]
        )
        print("\n=== Pairs stat-arb ===", flush=True)
        _run(
            [
                py,
                "RenTech/strategy_stack/run_pairs_statarb_standard.py",
                "--start",
                args.start,
                "--end",
                args.end,
                "--capital",
                str(args.capital),
            ]
        )

    rows: list[dict] = []
    for label, path in (
        ("sector_ls", args.sector_ls_daily),
        ("pairs_statarb", args.pairs_daily),
    ):
        path = path.expanduser().resolve()
        if not path.is_file():
            print(f"Missing {path}; pass --run-all", flush=True)
            continue
        meta = _load_meta(path)
        rows.append(
            {
                "sleeve": label,
                "return_pct": meta.get("total_return_pct"),
                "sharpe": meta.get("sharpe_daily"),
                "max_dd_pct": meta.get("max_drawdown_pct"),
                "beta_spy": meta.get("beta_vs_spy"),
                "corr_spy": meta.get("corr_vs_spy"),
            }
        )

    if not rows:
        raise SystemExit("No prototype daily CSVs found.")

    df = pd.DataFrame(rows)
    print(f"\n# Market-neutral prototypes ({args.start} → {args.end}, ${args.capital:,.0f})\n")
    print(df.to_string(index=False, float_format=lambda x: f"{x:.2f}" if pd.notna(x) else "nan"))
    print(
        "\nArtifacts:",
        f"\n  {args.sector_ls_daily}",
        f"\n  {args.pairs_daily}",
        sep="",
    )


if __name__ == "__main__":
    main()
