#!/usr/bin/env python3
"""
Pull IBKR account + compute live signals for the **stock-only Best Ideas** book.

Output: ``RenTech/data/logs/live_stock_only_signals.json``

Then rebuild the stock command center::

    cd /Users/robzingale/trading_bot
    PYTHONUNBUFFERED=1 .venv/bin/python -m RenTech.live.run_stock_only_signals
    PYTHONUNBUFFERED=1 .venv/bin/python -m RenTech.monitor.build_stock_command_center_snapshot --live-signals
    python -m http.server 8080
    # → http://localhost:8080/stock_command_center.html
"""

from __future__ import annotations

import argparse
import asyncio
import json
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.live.stock_only_signals import (  # noqa: E402
    DEFAULT_OUT,
    run_stock_only_signals_async,
    write_stock_only_signals,
)


def main() -> None:
    ap = argparse.ArgumentParser(description=__doc__.split("\n\n")[0])
    ap.add_argument(
        "--config",
        type=Path,
        default=_REPO / "RenTech/live/config/live_stock_only.json",
        help="IB broker settings (host/port/clientId); client_id 3 avoids VRP conflicts",
    )
    ap.add_argument("--out", type=Path, default=DEFAULT_OUT)
    ap.add_argument("--fund-scale", type=float, default=1.5, help="Match combine --fund-scale")
    ap.add_argument(
        "--offline",
        action="store_true",
        help="Yahoo-only signals (no TWS); skips IB position reconciliation",
    )
    args = ap.parse_args()

    payload = asyncio.run(
        run_stock_only_signals_async(
            config_path=args.config,
            fund_scale=float(args.fund_scale),
            offline=bool(args.offline),
        )
    )
    out = write_stock_only_signals(args.out, payload)
    n_add = sum(1 for a in payload.get("actions", []) if a.get("action") == "ADD")
    print(
        json.dumps(
            {
                "ok": True,
                "out": str(out),
                "fund_nav_usd": payload.get("fund_nav_usd"),
                "fund_scale": payload.get("fund_scale"),
                "n_actions": len(payload.get("actions", [])),
                "n_add": n_add,
                "data_source": payload.get("data_source"),
            },
            indent=2,
        )
    )


if __name__ == "__main__":
    main()
