"""Fetch and store Odds API snapshots for closing line tracking."""
import json
import subprocess
from datetime import datetime, timezone
from pathlib import Path

from nba_api.stats.static import teams as nba_teams_static

from .odds import get_nba_odds

SNAPSHOTS_DIR = Path(__file__).parent.parent.parent / "data" / "snapshots"

_FULL_TO_ABBR: dict[str, str] | None = None


def _full_to_abbr() -> dict[str, str]:
    global _FULL_TO_ABBR
    if _FULL_TO_ABBR is None:
        _FULL_TO_ABBR = {t["full_name"]: t["abbreviation"] for t in nba_teams_static.get_teams()}
    return _FULL_TO_ABBR


def _abbr(full_name: str) -> str:
    return _full_to_abbr().get(full_name, full_name[:3].upper())


def fetch_and_save(date: str | None = None, commit: bool = False) -> tuple[str, int]:
    """Fetch current NBA odds and save snapshot. Returns (path, requests_remaining)."""
    today = date or datetime.now(timezone.utc).strftime("%Y-%m-%d")
    events, remaining = get_nba_odds(markets="h2h,spreads,totals")

    snapshot = {
        "date": today,
        "captured_at": datetime.now(timezone.utc).isoformat(),
        "requests_remaining": remaining,
        "events": [],
    }

    abbr_map = _full_to_abbr()
    for ev in events:
        entry = {
            "id": ev["id"],
            "home_team": ev["home_team"],
            "away_team": ev["away_team"],
            "home_abbr": _abbr(ev["home_team"]),
            "away_abbr": _abbr(ev["away_team"]),
            "commence_time": ev["commence_time"],
            "markets": {},
        }
        for book in ev.get("bookmakers", []):
            for market in book.get("markets", []):
                mk = market["key"]
                if mk not in entry["markets"]:
                    entry["markets"][mk] = {"book": book["key"], "outcomes": market["outcomes"]}
        snapshot["events"].append(entry)

    SNAPSHOTS_DIR.mkdir(parents=True, exist_ok=True)
    out_path = SNAPSHOTS_DIR / f"{today}.json"
    out_path.write_text(json.dumps(snapshot, indent=2))

    if commit:
        _git_push(today)

    return str(out_path), int(remaining)


def _git_push(date: str) -> None:
    root = Path(__file__).parent.parent.parent
    subprocess.run(["git", "-C", str(root), "add", "data/snapshots/"], check=True)
    result = subprocess.run(
        ["git", "-C", str(root), "diff", "--staged", "--quiet"],
        capture_output=True,
    )
    if result.returncode != 0:
        subprocess.run(
            ["git", "-C", str(root), "commit", "-m", f"odds snapshot {date}"],
            check=True,
        )
        subprocess.run(["git", "-C", str(root), "push", "origin", "main"], check=True)


def load_snapshot(date: str) -> dict | None:
    p = SNAPSHOTS_DIR / f"{date}.json"
    if not p.exists():
        return None
    return json.loads(p.read_text())


def find_event_in_snapshot(snapshot: dict, team_home: str, team_away: str) -> dict | None:
    """Match bet teams (abbreviations) against snapshot events."""
    for ev in snapshot["events"]:
        if ev["home_abbr"] == team_home and ev["away_abbr"] == team_away:
            return ev
    return None
