"""MatchEvent -> Post kuyruğa alma. İçerik motorunu çağırır, tweet metnini üretir."""
import logging
from sqlalchemy.orm import Session

from app.db import models, crud
from app.content_engine import generator
from app.scheduler import coverage

log = logging.getLogger("scheduler.enqueue")

# Zaman-duyarlılık: kuyrukta bu süreden fazla bekleyen olaylar bayatlar (dk).
STALE_MINUTES = {
    "goal": 12, "goal_late": 12, "penalty_goal": 12, "own_goal": 12,
    "brace": 12, "hat_trick": 15,
    "yellow_card": 8, "second_yellow": 10, "red_card": 12,
    "penalty_missed": 10, "var": 8, "injury": 12, "substitution": 8,
    "kickoff": 10, "ht": 25, "second_half": 8, "ft": 45, "comeback": 15,
    "shootout": 15, "lineup": 40, "preview": 90,
    # planlı/haber içerikleri daha uzun yaşar
    "daily_fixture": 240, "results_roundup": 240, "standings": 480,
    "news": 180, "transfer": 240, "quote": 60,
}

# Dağıtım önceliği (küçük = önce). Gol/kırmızı öne geçer, haber en sonda.
PRIORITY = {
    "hat_trick": 1, "goal_late": 1, "comeback": 1,
    "goal": 1, "penalty_goal": 1, "own_goal": 1, "red_card": 1,
    "brace": 2, "second_yellow": 2, "ft": 2, "penalty_missed": 2, "shootout": 2,
    "ht": 2, "second_half": 2,
    "var": 3, "kickoff": 3, "injury": 3,
    "yellow_card": 4, "substitution": 4,
    # Yayıncı gol videosu: kendi gol tweetimizin hemen ardından gelmeli
    "quote": 2,
    "lineup": 5, "preview": 5,
    "daily_fixture": 6, "results_roundup": 6, "standings": 6,
    "transfer": 7, "news": 7, "manual": 2,
}


# Bir maçın thread'ini AÇABİLECEK olay tipleri. Bunların dışındaki bir olay
# ilk sırada gelirse (bot maç ortasında başlatıldıysa) yine kök olur.
THREAD_OPENERS = ("preview", "lineup", "kickoff")

# ANA AKIŞA çıkan olaylar — thread'e GÖMÜLMEZ.
#
# X'te kendi tweetine verilen yanıtlar profilin ana akışında görünmüyor;
# yalnızca thread içinde ve "Gönderiler ve yanıtlar" sekmesinde. İlk canlı
# maçta (17.08 Samsunspor-Göztepe) goller thread'e gidince profilde hiçbir
# maç içeriği görünmedi. En değerli içeriği gizlemek anlamsız: goller ve
# maçın kırılma anları ana akışa çıkar, ayrıntı thread'de kalır.
MAIN_TIMELINE_EVENTS = (
    "goal", "goal_late", "penalty_goal", "own_goal", "hat_trick", "brace",
    "red_card", "second_yellow", "comeback", "shootout", "ft",
)


def enqueue_events(db: Session, events: list[models.MatchEvent]) -> int:
    """Yeni olaylar için içerik üretip Post kaydı oluşturur.

    Lig kademesine uymayan olaylar hiç üretilmez (LLM maliyeti de doğmaz).
    Bir maçın ilk tweeti ana akışa gider ve thread kökü olur; sonrakiler
    o thread'e yanıt olarak işaretlenir.
    """
    created = 0
    # Bu çağrıda kökü belirlenen maçlar. DB sorgusuna güvenilemez: oturum
    # autoflush=False ile açıldığı için henüz commit edilmemiş postlar
    # sorgularda görünmez ve her olay kendini kök sanardı.
    opened_here: set[int] = set()

    for ev in events:
        # zaten post üretilmiş mi?
        exists = db.query(models.Post.id).filter_by(event_id=ev.id).first()
        if exists:
            continue
        match = db.get(models.Match, ev.match_id)
        if not match:
            continue

        # --- kapsam filtresi: bu lig bu olayı yayınlıyor mu?
        if not coverage.allows(match.league, ev.event_type, db):
            ev.tweeted = True          # değerlendirildi, bir daha bakma
            continue

        try:
            text = generator.generate(db, ev, match)
        except Exception as e:
            crud.add_log(db, f"İçerik üretilemedi (olay {ev.id}): {e}",
                         level="error", source="content")
            continue

        # --- thread mi ana akış mı?
        # Goller ve kırılma anları ana akışa çıkar (görünürlük); ayrıntı
        # olayları maçın thread'ine yanıt olur.
        if ev.event_type in MAIN_TIMELINE_EVENTS:
            yanit = False
        else:
            yanit = (
                bool(match.thread_tweet_id)
                or match.id in opened_here
                or _has_pending_root(db, match.id)
            )
        post = models.Post(
            match_id=match.id, event_id=ev.id, content=text,
            kind=ev.event_type, status="queued",
            is_reply=yanit,
        )
        db.add(post)
        opened_here.add(match.id)
        ev.tweeted = True  # kuyruğa alındı işareti (yeniden üretmeyi önler)
        created += 1
    if created:
        db.commit()
        crud.add_log(db, f"{created} tweet kuyruğa alındı", source="scheduler")
    return created


def _has_pending_root(db: Session, match_id: int) -> bool:
    """Bu maç için henüz gönderilmemiş bir kök tweet kuyrukta bekliyor mu?

    Aksi halde aynı maç için iki kök oluşur ve thread ikiye bölünür.
    """
    return (
        db.query(models.Post.id)
        .filter(
            models.Post.match_id == match_id,
            models.Post.is_reply == False,  # noqa: E712
            models.Post.status.in_(["queued", "approved"]),
        )
        .first()
        is not None
    )
