from __future__ import annotations

import argparse
import json
from pathlib import Path
from typing import Any

from src.market.context import DEFAULT_CONTEXT_UNIVERSE
from src.tools.market_confluence_report import build_report as build_market_report
from src.trader_desk.decision import DeskMandate, build_trader_desk_report, format_trader_desk_report
from src.trader_desk.finance_bridge import SAFE_DEFAULT_TARGET, export_finance_snapshot


def _load_payload(path: str | None, *, env: str, coins: tuple[str, ...]) -> dict[str, Any]:
    if path:
        return json.loads(Path(path).expanduser().read_text(encoding="utf-8"))
    return build_market_report(env=env, coins=coins)


def build_report(*, source_path: str | None = None, env: str = "mainnet", coins: tuple[str, ...] = DEFAULT_CONTEXT_UNIVERSE, max_plans: int = 8) -> dict[str, Any]:
    market_payload = _load_payload(source_path, env=env, coins=coins)
    mandate = DeskMandate()
    report = build_trader_desk_report(market_payload, mandate=mandate, max_plans=max_plans)
    return {
        "status": "ok",
        "source": source_path or "live_readonly_market_report",
        "report": report.to_dict(),
        "formatted": format_trader_desk_report(report),
        "live_order_allowed": False,
        "mainnet_signed_action": False,
    }


def main(argv: list[str] | None = None) -> int:
    parser = argparse.ArgumentParser(description="Build read-only professional Trader Desk report from Hyperliquid market/confluence context.")
    parser.add_argument("--from-report", help="Existing market_confluence_report JSON path. If omitted, build a fresh read-only report.")
    parser.add_argument("--env", choices=["mainnet", "testnet"], default="mainnet")
    parser.add_argument("--coins", default=",".join(DEFAULT_CONTEXT_UNIVERSE))
    parser.add_argument("--output", default="runtime/reports/trader_desk_latest.json")
    parser.add_argument("--max-plans", type=int, default=8)
    parser.add_argument("--export-finance", action="store_true", help="Also export a sanitized FinanceManager bridge snapshot.")
    parser.add_argument("--finance-output", default=str(SAFE_DEFAULT_TARGET))
    parser.add_argument("--json", action="store_true")
    args = parser.parse_args(argv)

    coins = tuple(c.strip().upper() for c in args.coins.split(",") if c.strip())
    payload = build_report(source_path=args.from_report, env=args.env, coins=coins, max_plans=args.max_plans)
    output = Path(args.output)
    output.parent.mkdir(parents=True, exist_ok=True)
    output.write_text(json.dumps(payload, indent=2, sort_keys=True, default=str), encoding="utf-8")
    if args.export_finance:
        payload["finance_export"] = export_finance_snapshot(payload, target=args.finance_output)
    if args.json:
        print(json.dumps({"status": "ok", "output": str(output), **payload}, indent=2, sort_keys=True, default=str))
    else:
        print(payload["formatted"])
    return 0


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