#!/usr/bin/env python3
"""
Pull a small batch of odds from The Odds API (v4) and write raw JSON dumps into:
  /var/www/html/eventheodds/data/external_feeds/inbox/theoddsapi/

This is intentionally *raw-only* and is meant to feed SportsDB.ExternalFeedRecord via the
background external-feeds ingester (deduped by content hash).
"""

from __future__ import annotations

import argparse
import json
import os
import time
from datetime import datetime
from pathlib import Path
from urllib.parse import urlencode
from urllib.request import urlopen, Request


BASE_URL = "https://api.the-odds-api.com/v4"

DEFAULT_SPORT_KEYS = [
    # Basketball
    "basketball_nba",
    "basketball_wnba",
    "basketball_ncaab",
    # Football
    "americanfootball_nfl",
    "americanfootball_ncaaf",
    # Baseball
    "baseball_mlb",
    # Soccer (some)
    "soccer_epl",
]


def now_iso() -> str:
    return datetime.utcnow().replace(microsecond=0).isoformat() + "Z"


def write_atomic(path: Path, payload: object) -> None:
    path.parent.mkdir(parents=True, exist_ok=True)
    tmp = path.with_suffix(path.suffix + ".tmp")
    tmp.write_text(json.dumps(payload, indent=2, default=str))
    tmp.replace(path)


def fetch_json(url: str, timeout: int = 40) -> object:
    req = Request(url, headers={"User-Agent": "eventheodds/1.0"})
    with urlopen(req, timeout=timeout) as r:
        body = r.read().decode("utf-8")
        return json.loads(body)


def main() -> int:
    ap = argparse.ArgumentParser()
    ap.add_argument("--out-dir", default=os.environ.get("THEODDS_OUT_DIR", "/var/www/html/eventheodds/data/external_feeds/inbox/theoddsapi"))
    ap.add_argument("--sports", default=",".join(DEFAULT_SPORT_KEYS), help="Comma list of TheOdds sport keys or 'all'")
    ap.add_argument("--markets", default="h2h,spreads,totals")
    ap.add_argument("--regions", default="us")
    ap.add_argument("--odds-format", default="american")
    ap.add_argument("--sleep", type=float, default=1.0)
    args = ap.parse_args()

    api_key = (os.environ.get("THE_ODDS_API_KEY") or os.environ.get("ODDS_API_KEY") or "").strip()
    if not api_key:
        raise SystemExit("Missing THE_ODDS_API_KEY (or ODDS_API_KEY) in environment")

    if args.sports.strip().lower() == "all":
        sport_keys = DEFAULT_SPORT_KEYS
    else:
        sport_keys = [s.strip() for s in args.sports.split(",") if s.strip()]

    out_dir = Path(args.out_dir)
    out_dir.mkdir(parents=True, exist_ok=True)

    fetched = 0
    for sk in sport_keys:
        qs = urlencode(
            {
                "apiKey": api_key,
                "regions": args.regions,
                "markets": args.markets,
                "oddsFormat": args.odds_format,
            }
        )
        url = f"{BASE_URL}/sports/{sk}/odds?{qs}"

        try:
            data = fetch_json(url)
        except Exception as e:
            payload = {"ok": False, "fetchedAt": now_iso(), "source": "theoddsapi", "sportKey": sk, "url": url, "error": str(e)}
            out_path = out_dir / f"{sk}_odds_error_{int(time.time())}.json"
            write_atomic(out_path, payload)
            time.sleep(args.sleep)
            continue

        payload = {
            "ok": True,
            "fetchedAt": now_iso(),
            "source": "theoddsapi",
            "sportKey": sk,
            "url": url.replace(api_key, "<redacted>"),
            "data": data,
        }
        out_path = out_dir / f"{sk}_odds_{int(time.time())}.json"
        write_atomic(out_path, payload)
        fetched += 1

        time.sleep(args.sleep)

    print(f"[theodds_dump] wrote {fetched} file(s) to {out_dir}")
    return 0


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

