"""Anlatım yoğunluğu — aynı anda oynanan onlarca maçı yönetmek için.

SORUN
-----
Cumartesi 19:00'da 15 maç birden başlayabiliyor. Her maçın her olayını ayrı
tweet yapmak iki şekilde kırılıyor:
  1. Fiziksel sınır: insansı tempoda (90-400 sn) saatte ~15 tweet atılabilir;
     15 maçta ilk yarıda 30+ olay çıkar. Kuyruk şişer, goller "bayat" diye
     iptal olur — yani en önemli içerik sessizce kaybolur.
  2. Zaman çizelgesi spam'a döner, takipçi kaçar, ban riski artar.

ÇÖZÜM (üç katman)
-----------------
1. KADEME: Her lig için anlatım yoğunluğu. Süper Lig dakika dakika anlatılır,
   Ligue 1'den yalnız gol/kırmızı/sonuç, alt sıradaki liglerden sadece skor.
2. THREAD: Bir maçın tüm olayları ana akışa değil, o maçın thread'ine yanıt
   olarak gider. Ana akış maç başına tek tweet görür; detay isteyen thread'i
   açar. Ajanslar da böyle yapıyor.
3. TEMPO AYRIMI: Thread yanıtları takipçi akışını doldurmadığı için ana akış
   tweetlerinden çok daha hızlı gidebilir (bkz. dispatcher).

Böylece 15 eşzamanlı maçta bile goller anında çıkar, ana akış temiz kalır.
"""

# Kademe -> yayınlanacak olay tipleri
FULL = {
    "preview", "lineup", "kickoff", "goal", "goal_late", "penalty_goal",
    "own_goal", "brace", "hat_trick", "yellow_card", "second_yellow",
    "red_card", "penalty_missed", "var", "injury", "ht", "second_half",
    "ft", "comeback", "shootout",
}
STANDARD = {
    "kickoff", "goal", "goal_late", "penalty_goal", "own_goal", "brace",
    "hat_trick", "second_yellow", "red_card", "penalty_missed",
    "ht", "ft", "comeback", "shootout",
}
MINIMAL = {
    "goal", "goal_late", "penalty_goal", "own_goal", "hat_trick",
    "red_card", "ft",
}
RESULT_ONLY = {"ft"}

TIERS = {
    "full": FULL,
    "standard": STANDARD,
    "minimal": MINIMAL,
    "result_only": RESULT_ONLY,
}

# 'auto' seçiliyken lig önceliğinden kademe türet
AUTO_BY_PRIORITY = {
    1: "full",       # Süper Lig, Şampiyonlar Ligi
    2: "standard",   # Trendyol 1. Lig, Avrupa Ligi
    3: "standard",   # Konferans Ligi, Premier Lig, La Liga...
    4: "minimal",
    5: "minimal",
}

TIER_LABELS = {
    "auto": "Otomatik (lig önceliğine göre)",
    "full": "Tam anlatım — her olay",
    "standard": "Standart — gol, kırmızı, devre, sonuç",
    "minimal": "Az — gol, kırmızı kart, sonuç",
    "result_only": "Sadece sonuç",
}


def tier_for_league(league) -> str:
    """Ligin efektif kademesi ('auto' ise önceliğe göre çözülür)."""
    if league is None:
        return "minimal"
    chosen = (league.coverage or "auto").lower()
    if chosen != "auto" and chosen in TIERS:
        return chosen
    return AUTO_BY_PRIORITY.get(league.priority or 5, "minimal")


def effective_tier(db, league) -> str:
    """Bütçe planı uygulandıktan sonraki gerçek kademe.

    Planlayıcı yalnızca AŞAĞI çeker; kullanıcının seçtiği kademe tavandır
    (bkz. scheduler/budget.py). Plan yoksa ayarlanan kademe geçerlidir.
    """
    base = tier_for_league(league)
    if league is None or db is None:
        return base
    if not _budget_enabled(db):
        return base
    from app.scheduler import budget
    planned = budget.get_plan(db).get(league.key)
    if not planned or planned not in TIERS:
        return base
    # planı yalnızca daha hafifse uygula
    order = ["result_only", "minimal", "standard", "full"]
    return planned if order.index(planned) < order.index(base) else base


def _budget_enabled(db) -> bool:
    from app.db import crud
    return crud.get_setting(db, "budget_enabled", "true") == "true"


def allows(league, event_type: str, db=None) -> bool:
    """Bu lig için bu olay tipi yayınlanmalı mı?"""
    tier = effective_tier(db, league) if db is not None else tier_for_league(league)
    return event_type in TIERS[tier]
