from __future__ import annotations

import argparse
import json
from decimal import Decimal
from pathlib import Path
from datetime import datetime, timezone

from src.hyperliquid.api_health import ApiHealthMonitor
from src.hyperliquid.market_data import HyperliquidMarketData
from src.market.collector import MarketContextCollector
from src.market.context import DEFAULT_CONTEXT_UNIVERSE
from src.risk.data_quality_gate import DataQualityGate


def main(argv: list[str] | None = None) -> int:
    parser = argparse.ArgumentParser(description="Collect v76 Hyperliquid market context and data-quality status. Read-only.")
    parser.add_argument("--env", choices=["mainnet", "testnet"], default="mainnet")
    parser.add_argument("--coins", default=",".join(DEFAULT_CONTEXT_UNIVERSE))
    parser.add_argument("--json", action="store_true")
    args = parser.parse_args(argv)
    health = ApiHealthMonitor()
    snapshot = MarketContextCollector(HyperliquidMarketData(env=args.env), health).collect(coins=tuple(c.strip().upper() for c in args.coins.split(",") if c.strip()))
    gate = DataQualityGate()
    payload = {"env": args.env, "timestamp": datetime.now(timezone.utc).isoformat(), "coins": {}, "api_health": health.report()}
    for coin, ctx in sorted(snapshot.contexts.items()):
        decision = gate.evaluate(ctx, degraded_mode_active=health.degraded_mode_active)
        payload["coins"][coin] = {
            "rsi": str(ctx.rsi), "sma_fast": str(ctx.sma_fast), "sma_slow": str(ctx.sma_slow), "atr": str(ctx.atr),
            "funding": str(ctx.funding), "volume": str(ctx.volume), "mid": str(ctx.mid),
            "spread_pct": str(ctx.spread_pct) if ctx.spread_pct is not None else None,
            "timestamp": ctx.timestamp.isoformat(), "reliability_score": str(ctx.reliability_score),
            "stale_data": ctx.stale_data, "l2_available": ctx.l2_available,
            "data_quality_allowed": decision.allowed, "data_quality_reasons": decision.reasons,
        }
    path = Path("runtime/reports") / f"market_context_{datetime.now(timezone.utc).strftime('%Y%m%d_%H%M%S')}.json"
    path.parent.mkdir(parents=True, exist_ok=True)
    path.write_text(json.dumps(payload, indent=2, default=str, sort_keys=True), encoding="utf-8")
    payload["saved_to"] = str(path)
    print(json.dumps(payload, indent=2, default=str, sort_keys=True) if args.json else payload)
    return 0


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