import os
from pathlib import Path

import httpx

BASE = "https://api.the-odds-api.com/v4"
SPORT = "basketball_nba"
SHARP_BOOKS = ["pinnacle", "draftkings", "fanduel"]


def _key() -> str:
    key = os.environ.get("ODDS_API_KEY")
    if key:
        return key
    env_file = Path.home() / ".betlab" / ".env"
    if env_file.exists():
        for line in env_file.read_text().splitlines():
            if line.startswith("ODDS_API_KEY="):
                return line.split("=", 1)[1].strip()
    raise RuntimeError("ODDS_API_KEY not set. Add ODDS_API_KEY=... to ~/.betlab/.env")


def _get(path: str, params: dict) -> tuple[any, str]:
    params["apiKey"] = _key()
    params["oddsFormat"] = "decimal"
    resp = httpx.get(f"{BASE}{path}", params=params, timeout=20)
    resp.raise_for_status()
    remaining = resp.headers.get("x-requests-remaining", "?")
    return resp.json(), remaining


def get_nba_odds(markets: str = "h2h,spreads,totals") -> tuple[list[dict], str]:
    """Current NBA game odds from sharp books. Returns (events, requests_remaining)."""
    data, remaining = _get(
        f"/sports/{SPORT}/odds",
        {
            "regions": "us,eu",
            "markets": markets,
            "bookmakers": ",".join(SHARP_BOOKS),
        },
    )
    return data, remaining


def get_event_props(event_id: str) -> tuple[dict, str]:
    """Player prop odds for a specific event. Costs 4 requests."""
    data, remaining = _get(
        f"/sports/{SPORT}/events/{event_id}/odds",
        {
            "regions": "us",
            "markets": "player_points,player_rebounds,player_assists,player_threes,player_points_rebounds_assists",
            "bookmakers": "draftkings,fanduel",
        },
    )
    return data, remaining


def extract_sharp_line(event: dict, market_key: str, book_priority: list[str] = SHARP_BOOKS) -> dict | None:
    """Pull best available sharp line for a market from an event dict."""
    for book_key in book_priority:
        book = next((b for b in event.get("bookmakers", []) if b["key"] == book_key), None)
        if not book:
            continue
        market = next((m for m in book.get("markets", []) if m["key"] == market_key), None)
        if market:
            return {"book": book_key, "outcomes": market["outcomes"]}
    return None
