from nba_api.stats.static import players
from app.utils.cache import cache_get, cache_set
from app.config import PLAYER_SEARCH_TTL


def normalize_name(name):
    return name.strip().lower()


def search_players(name):
    cache_key = f"nba:player:{normalize_name(name)}"
    cached = cache_get(cache_key)
    if cached is not None:
        return cached

    all_players = players.get_players()
    search_lower = normalize_name(name)

    matches = []
    for p in all_players:
        full_name = p["full_name"].lower()
        if search_lower in full_name:
            matches.append({
                "player_id": p["id"],
                "full_name": p["full_name"],
                "is_active": p["is_active"],
            })

    cache_set(cache_key, matches, PLAYER_SEARCH_TTL)
    return matches


def resolve_player(name):
    """Resolve a player name to a single active player. Returns (player_id, full_name) or raises."""
    matches = search_players(name)
    active = [m for m in matches if m["is_active"]]

    if not active:
        if matches:
            # Return first inactive match as fallback
            return matches[0]["player_id"], matches[0]["full_name"]
        return None, None

    # Prefer exact match
    search_lower = normalize_name(name)
    for m in active:
        if m["full_name"].lower() == search_lower:
            return m["player_id"], m["full_name"]

    return active[0]["player_id"], active[0]["full_name"]
