"""Kaynak gönderileri için önem puanı.

NEDEN GEREKLİ
-------------
Yoğun bir maç gününde yayıncı saatte 15-20 gol/aksiyon paylaşıyor, bizim
saatlik hakkımız ise 2-3. Puan olmadan "ilk gelen" paylaşılıyordu; yani
Süper Lig derbisindeki gol, alt ligdeki sıradan bir golün arkasında
kalabiliyordu.

Puan iki parçadan oluşur:
  - DURAĞAN (toplama anında hesaplanır, DB'de saklanır): içerik türü,
    medya, lig önemi, takım büyüklüğü, kaynağın etkileşimi
  - DİNAMİK (seçim anında eklenir): tazelik — canlı maçta 5 dakikalık gol
    50 dakikalıktan değerlidir

Ayrıca bir ALT EŞİK vardır: bütçe boş diye zayıf içerik paylaşılmaz.
Spam yapmamanın yolu, hakkı doldurmak değil, hak ettiğini paylaşmaktır.
"""
from datetime import datetime

# --- içerik türü
KIND_SCORE = {
    "goal": 50,
    "action": 32,   # kurtarış, kırmızı kart, penaltı, VAR
    "summary": 12,
    "interview": 5,
    "studio": 0,
    "promo": 0,
    "other": 3,
}

# --- medya: video en değerlisi
MEDIA_SCORE = {"video": 18, "photo": 6, "": 0}

# --- lig önemi (League.priority üzerinden)
LEAGUE_SCORE = {1: 26, 2: 16, 3: 9, 4: 4, 5: 2}

# --- Türk seyircisi için ağırlıklı takımlar
BIG_TEAMS = ["galatasaray", "fenerbahçe", "fenerbahce", "beşiktaş", "besiktas",
             "trabzonspor"]
NOTABLE_TEAMS = ["başakşehir", "basaksehir", "samsunspor", "göztepe", "goztepe",
                 "eyüpspor", "eyupspor", "kasımpaşa", "konyaspor", "rizespor",
                 "kayserispor", "antalyaspor", "alanyaspor", "gaziantep",
                 "sivasspor", "kocaelispor", "gençlerbirliği"]

# --- gol anlatısı: bu kelimeler golün "büyük" olduğuna işaret eder
DRAMA_WORDS = ["son dakika", "90+", "muhteşem", "muhtesem", "harika", "efsane",
               "roket", "frikik", "şık", "sik ", "klas", "olağanüstü",
               "beraberlik golü", "galibiyet golü", "kritik", "penaltı",
               "kırmızı kart", "hat-trick", "hat trick"]


def engagement_score(retweets: int, likes: int) -> int:
    """Kaynağın kendi etkileşimi — gerçek dünyadan gelen önem sinyali.

    Doğrusal değil: 100 RT ile 200 RT arasındaki fark, 0 ile 20 arasındaki
    kadar anlamlı değil. Üst sınır 20.
    """
    raw = (retweets or 0) * 2 + (likes or 0) * 0.4
    if raw <= 0:
        return 0
    if raw < 20:
        return 3
    if raw < 60:
        return 8
    if raw < 150:
        return 13
    if raw < 400:
        return 17
    return 20


def static_score(kind: str, media: str, text: str, match=None,
                 retweets: int = 0, likes: int = 0) -> int:
    """Toplama anında hesaplanan, zamanla değişmeyen puan."""
    score = KIND_SCORE.get(kind, 0)
    if score == 0:
        return 0          # promo/studio: hiç aday değil

    score += MEDIA_SCORE.get(media or "", 0)

    low = (text or "").lower()

    # Lig önemi
    if match is not None and getattr(match, "league", None) is not None:
        score += LEAGUE_SCORE.get(match.league.priority or 5, 2)

    # Takım büyüklüğü — metinden VE eşleşen maçtan bakılır
    blob = low
    if match is not None:
        blob += " " + (match.home_team or "").lower() + " " + (match.away_team or "").lower()
    big_hits = sum(1 for t in BIG_TEAMS if t in blob)
    if big_hits >= 2:
        score += 22       # derbi
    elif big_hits == 1:
        score += 14
    elif any(t in blob for t in NOTABLE_TEAMS):
        score += 5

    # Anlatı gücü
    if any(w in low for w in DRAMA_WORDS):
        score += 8

    score += engagement_score(retweets, likes)
    return max(0, score)


def freshness_bonus(posted_at: datetime | None, now: datetime | None = None) -> int:
    """Seçim anında eklenir: canlı anın değeri hızla düşer."""
    if not posted_at:
        return 0
    now = now or datetime.utcnow()
    dk = (now - posted_at).total_seconds() / 60
    if dk < 0:
        return 0
    if dk <= 10:
        return 20
    if dk <= 25:
        return 12
    if dk <= 45:
        return 6
    if dk <= 90:
        return 2
    return 0


def total_score(item, now: datetime | None = None) -> int:
    return (item.score or 0) + freshness_bonus(item.posted_at, now)


def explain(item, now: datetime | None = None) -> str:
    """Panelde 'neden bu puan' göstermek için kısa açıklama."""
    parts = [f"tür {KIND_SCORE.get(item.kind, 0)}"]
    if item.media:
        parts.append(f"{item.media} +{MEDIA_SCORE.get(item.media, 0)}")
    if item.retweets or item.likes:
        parts.append(f"etkileşim +{engagement_score(item.retweets, item.likes)}")
    fb = freshness_bonus(item.posted_at, now)
    if fb:
        parts.append(f"tazelik +{fb}")
    return " · ".join(parts)
