#!/usr/bin/env python3
"""
Run ``execute_portfolio_merge`` with **all sleeves** in one place.

Edit ``CONFIG`` below (USD amounts and/or ``*_pct`` of ``total_capital``). If a ``*_pct``
key is set, it **overrides** the matching USD field (same rules as ``portfolio_vrp_plus_vxx.py``).

Usage::

    cd /path/to/trading_bot
    .venv/bin/python RenTech/strategy_stack/run_portfolio_custom.py

Paths default to ``RenTech/data/logs/``. Regenerate JSONLs from the IV/VXX backtests when needed.
"""
from __future__ import annotations

import sys
from pathlib import Path

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

from RenTech.strategy_stack.portfolio_vrp_plus_vxx import (  # noqa: E402
    LOGS,
    _risk_budget_from_pct_or_usd,
    execute_portfolio_merge,
)

# ---------------------------------------------------------------------------
# Customize here — all sleeves + risk refs + paths
# ---------------------------------------------------------------------------
CONFIG: dict = {
    # Account
    "total_portfolio_capital": 100_000.0,
    # VRP main book (PnL scaler vs vrp_ref; not an overlay risk budget)
    "capital_vrp": None,  # None => use total_portfolio_capital
    "capital_vrp_pct": None,  # e.g. 1.0 = 100% of total as scale numerator
    "vrp_ref": 100_000.0,
    # IV overlay risk budgets (USD) — max loss / debit semantics in merge
    "capital_put": 10_000.0,
    "capital_put_pct": None,  # e.g. 0.0001 for 0.01% of total
    "capital_straddle": 10_000.0,
    "capital_straddle_pct": None,
    "capital_risk_reversal": 10_000.0,
    "capital_risk_reversal_pct": None,
    # VXX sleeve (total budget, then split bear/call)
    "capital_vxx": 15_000.0,
    "capital_vxx_pct": None,  # e.g. 0.03 for 3% of total
    "vxx_bear_pct": 90.0,
    "vxx_call_pct": 10.0,
    # Risk refs (None => median broker_risk_usd per JSONL / inferred)
    "overlay_ref": None,
    "put_risk_ref": None,
    "straddle_risk_ref": None,
    "rr_risk_ref": None,
    "vxx_ref": None,
    "vxx_bear_risk_ref": None,
    "vxx_call_risk_ref": None,
    # Trade logs
    "vrp_trades": LOGS / "vrp_trades.jsonl",
    "put_trades": LOGS / "stress_longvol_otm_put.jsonl",
    "straddle_trades": LOGS / "stress_longvol_straddle.jsonl",
    "risk_reversal_trades": LOGS / "risk_reversal.jsonl",
    "vxx_bear_trades": LOGS / "vxx_portfolio_bear_call.jsonl",
    "vxx_call_trades": LOGS / "vxx_portfolio_long_call.jsonl",
    "out_csv": LOGS / "portfolio_vrp_vxx_equity.csv",
    # Output
    "print_report": True,
    "print_vxx_sweep": False,
}


def _resolve(cfg: dict) -> dict:
    tc = float(cfg["total_portfolio_capital"])
    cap_vrp = cfg["capital_vrp"]
    if cfg.get("capital_vrp_pct") is not None:
        cap_vrp = tc * float(cfg["capital_vrp_pct"])

    put = _risk_budget_from_pct_or_usd(
        usd=float(cfg["capital_put"]),
        pct=cfg.get("capital_put_pct"),
        total_capital=tc,
    )
    st = _risk_budget_from_pct_or_usd(
        usd=float(cfg["capital_straddle"]),
        pct=cfg.get("capital_straddle_pct"),
        total_capital=tc,
    )
    rr = _risk_budget_from_pct_or_usd(
        usd=float(cfg["capital_risk_reversal"]),
        pct=cfg.get("capital_risk_reversal_pct"),
        total_capital=tc,
    )
    vxx = _risk_budget_from_pct_or_usd(
        usd=float(cfg["capital_vxx"]),
        pct=cfg.get("capital_vxx_pct"),
        total_capital=tc,
    )
    return {
        "total_portfolio_capital": tc,
        "capital_vrp": cap_vrp,
        "capital_put": put,
        "capital_straddle": st,
        "capital_risk_reversal": rr,
        "capital_vxx": vxx,
    }


def main() -> None:
    r = _resolve(CONFIG)
    print(
        "Resolved risk budgets (USD): "
        f"put={r['capital_put']:,.0f}  straddle={r['capital_straddle']:,.0f}  "
        f"RR={r['capital_risk_reversal']:,.0f}  VXX={r['capital_vxx']:,.0f}  "
        f"(total_capital={r['total_portfolio_capital']:,.0f})\n"
    )
    execute_portfolio_merge(
        vrp_trades=Path(CONFIG["vrp_trades"]),
        total_portfolio_capital=r["total_portfolio_capital"],
        capital_vrp=r["capital_vrp"],
        capital_put=r["capital_put"],
        capital_straddle=r["capital_straddle"],
        capital_risk_reversal=r["capital_risk_reversal"],
        capital_vxx=r["capital_vxx"],
        vxx_bear_pct=float(CONFIG["vxx_bear_pct"]),
        vxx_call_pct=float(CONFIG["vxx_call_pct"]),
        vrp_ref=float(CONFIG["vrp_ref"]),
        overlay_ref=CONFIG.get("overlay_ref"),
        put_risk_ref=CONFIG.get("put_risk_ref"),
        straddle_risk_ref=CONFIG.get("straddle_risk_ref"),
        rr_risk_ref=CONFIG.get("rr_risk_ref"),
        vxx_ref=CONFIG.get("vxx_ref"),
        vxx_bear_risk_ref=CONFIG.get("vxx_bear_risk_ref"),
        vxx_call_risk_ref=CONFIG.get("vxx_call_risk_ref"),
        put_trades=Path(CONFIG["put_trades"]),
        straddle_trades=Path(CONFIG["straddle_trades"]),
        risk_reversal_trades=Path(CONFIG["risk_reversal_trades"]),
        vxx_bear_trades=Path(CONFIG["vxx_bear_trades"]),
        vxx_call_trades=Path(CONFIG["vxx_call_trades"]),
        out_csv=Path(CONFIG["out_csv"]),
        print_report=bool(CONFIG["print_report"]),
        print_vxx_sweep=bool(CONFIG["print_vxx_sweep"]),
    )


if __name__ == "__main__":
    main()
