"""SofaScore resmi olmayan API istemcisi.

Normal HTTP istemcileri TLS parmak izinden engelleniyor (403); curl_cffi ile
Chrome taklidi yapılır. Tüm çağrılar hata toleranslıdır: sorun olursa None döner,
çağıran taraf loglar ve bir sonraki turda tekrar dener.
"""
import time
import random
import logging
from curl_cffi import requests

log = logging.getLogger("data.sofascore")

BASE = "https://api.sofascore.com/api/v1"

# Doğrulanmış uniqueTournament id'leri (16.08.2026'da canlı test edildi)
TOURNAMENT_IDS = {
    "super_lig": 52,
    "trendyol_1lig": 98,
    "ucl": 7,
    "uel": 679,
    "uecl": 17015,
    "premier_league": 17,
    "la_liga": 8,
    "serie_a": 23,
    "bundesliga": 35,
    "ligue_1": 34,
}

_last_request_ts = 0.0
_MIN_INTERVAL = 0.8  # istekler arası nazik minimum boşluk (sn)


def _get(path: str, timeout: int = 25):
    """Tek GET; nazik aralık + Chrome taklidi. Hata durumunda None."""
    global _last_request_ts
    wait = _MIN_INTERVAL - (time.time() - _last_request_ts)
    if wait > 0:
        time.sleep(wait + random.uniform(0, 0.3))
    try:
        r = requests.get(BASE + path, impersonate="chrome", timeout=timeout)
        _last_request_ts = time.time()
        if r.status_code == 200:
            return r.json()
        if r.status_code == 404:
            return None  # veri yok (normal durum, ör. incident'sız maç)
        log.warning("SofaScore %s -> %s", path, r.status_code)
        return None
    except Exception as e:
        _last_request_ts = time.time()
        log.warning("SofaScore %s -> istek hatası: %s", path, e)
        return None


# ------------------------------------------------------------------ Fikstür
def get_current_season_id(utid: int):
    data = _get(f"/unique-tournament/{utid}/seasons")
    if not data or not data.get("seasons"):
        return None
    return data["seasons"][0]["id"]  # ilk eleman = güncel sezon


def get_fixture_events(utid: int, season_id: int, which: str = "next", page: int = 0):
    """which: 'next' (gelecek) veya 'last' (son oynanan). events listesi döner."""
    data = _get(f"/unique-tournament/{utid}/season/{season_id}/events/{which}/{page}")
    if not data:
        return []
    return data.get("events", [])


def get_standings(utid: int, season_id: int) -> list[dict]:
    """Puan durumu. [{position, team, points, matches, wins, draws, losses}, ...]"""
    data = _get(f"/unique-tournament/{utid}/season/{season_id}/standings/total")
    if not data or not data.get("standings"):
        return []
    rows = data["standings"][0].get("rows", [])
    return [
        {
            "position": r.get("position"),
            "team": (r.get("team") or {}).get("name", ""),
            "points": r.get("points"),
            "matches": r.get("matches"),
            "wins": r.get("wins"),
            "draws": r.get("draws"),
            "losses": r.get("losses"),
        }
        for r in rows
    ]


# ------------------------------------------------------------------ Canlı
def get_live_events():
    """O an dünyada canlı olan tüm maçlar. Çağıran taraf lige göre filtreler."""
    data = _get("/sport/football/events/live")
    if not data:
        return []
    return data.get("events", [])


def get_event(event_id: int):
    """Tek maçın güncel detayı (canlı listeden düşen maçın final skoru için)."""
    data = _get(f"/event/{event_id}")
    if not data:
        return None
    return data.get("event")


def get_incidents(event_id: int):
    """Bir maçın olay listesi (gol, kart, VAR, devre, uzatma...)."""
    data = _get(f"/event/{event_id}/incidents")
    if not data:
        return []
    return data.get("incidents", [])


# İstatistikte hangi kalemleri alıyoruz: tweette anlam taşıyan, seyircinin
# umursadığı ölçüler. Tamamını almak LLM'i boğuyor ve maliyeti artırıyor.
_WANTED_STATS = {
    "Ball possession": "topla oynama",
    "Total shots": "şut",
    "Shots on target": "isabetli şut",
    "Expected goals": "xG",
    "Big chances": "net fırsat",
    "Corner kicks": "korner",
    "Goalkeeper saves": "kaleci kurtarışı",
    "Fouls": "faul",
    "Yellow cards": "sarı kart",
}


def get_statistics(event_id: int, period: str = "ALL") -> dict:
    """Maç istatistikleri: {'topla oynama': ('66%', '34%'), ...}

    Anlatının UYDURULMAMASI için var: LLM'e "baskılıydı" dedirtmek yerine
    gerçek sayıyı veriyoruz. period: ALL | 1ST | 2ND
    """
    data = _get(f"/event/{event_id}/statistics")
    if not data or not data.get("statistics"):
        return {}
    blok = next((s for s in data["statistics"] if s.get("period") == period),
                data["statistics"][0])
    out = {}
    for grup in blok.get("groups", []):
        for it in grup.get("statisticsItems", []):
            ad = it.get("name")
            if ad in _WANTED_STATS and _WANTED_STATS[ad] not in out:
                out[_WANTED_STATS[ad]] = (it.get("home"), it.get("away"))
    return out


def get_best_players(event_id: int) -> dict:
    """Maçın en iyileri: {'ev': (ad, puan), 'deplasman': (ad, puan)}"""
    data = _get(f"/event/{event_id}/best-players")
    if not data:
        return {}
    out = {}
    for anahtar, etiket in (("bestHomeTeamPlayer", "ev"),
                            ("bestAwayTeamPlayer", "deplasman")):
        p = data.get(anahtar) or {}
        ad = (p.get("player") or {}).get("name") or p.get("name")
        if ad:
            out[etiket] = (ad, p.get("value"))
    return out


def get_lineups(event_id: int):
    """İlk 11'ler. Açıklanmadıysa None/boş dönebilir."""
    return _get(f"/event/{event_id}/lineups")


# ------------------------------------------------------------------ Yardımcı
def event_unique_tournament_id(ev: dict):
    return ((ev.get("tournament") or {}).get("uniqueTournament") or {}).get("id")


def event_scores(ev: dict):
    hs = (ev.get("homeScore") or {}).get("current")
    as_ = (ev.get("awayScore") or {}).get("current")
    return hs, as_
