"""Wiro.ai ile görsel üretimi — maç kartları.

NEREDE KULLANILIR
-----------------
Zaman baskısı OLMAYAN içeriklerde: maç önü, devre arası, maç sonu.
Goller görselsiz kalır: üretim 70-90 sn sürüyor ve golün değeri hızında.

TASARIM KURALLARI (test edilerek bulundu, 18.08)
------------------------------------------------
- bytedance/seedream-v5-pro-uncensored: tipografi güçlü, Türkçe karakterler
  (Ç, Ö, Ü, İ, Ş) sorunsuz çıkıyor.
- KULÜP ARMASI ÇİZDİRİLMEZ: model uydurma arma basıyor, taraftar sahte
  armayı anında tanır. Prompt'ta açıkça yasaklanır.
- Takım renkleri bölünmüş kompozisyon + stadyum atmosferi = yayıncı kalitesi.

AKIŞ
----
enqueue tweet'i üretir -> imagegen işi (scheduler) kuyruktaki görselsiz
kartları bulur -> Wiro'da üretir -> Post.media_source_url'e yazar ->
dispatcher gönderirken indirip yükler (mevcut mekanizma).
Dispatcher görsel bekleyen kartı IMAGE_WAIT_MIN dakika bekletir; süre
dolarsa metin olarak gönderir (görsel hiçbir içeriği engellememeli).
"""
import logging
import time

import httpx
from sqlalchemy.orm import Session

from app.db import models, crud

log = logging.getLogger("content.imagegen")

BASE = "https://api.wiro.ai/v1"
MODEL = "bytedance/seedream-v5-pro-uncensored"

# Gol tipleri — kullanıcı isteğiyle (18.08) goller de görsel alıyor.
# Hız güvencesi: dispatcher görseli en fazla IMAGE_WAIT_MIN bekler; görsel
# yetişmezse tweet METİN olarak gider. Gol asla görsel yüzünden bayatlamaz.
GOAL_KINDS = ("goal", "goal_late", "penalty_goal", "own_goal",
              "hat_trick", "brace")
# Görsel eklenen içerik tipleri
IMAGE_KINDS = ("ft", "ht", "preview") + GOAL_KINDS
# Dispatcher, görseli olmayan bu tip postları en fazla bu kadar bekletir
IMAGE_WAIT_MIN = 4

# Süper Lig takım renkleri (ana, vurgu). Bilinmeyen takım için nötr tema.
TEAM_COLORS = {
    "galatasaray": ("#A90432", "#FDB912"),
    "fenerbahçe": ("#163962", "#FFED00"),
    "beşiktaş": ("#000000", "#FFFFFF"),
    "trabzonspor": ("#81153A", "#5EA5DA"),
    "samsunspor": ("#E30613", "#FFFFFF"),
    "göztepe": ("#FDB913", "#E30613"),
    "başakşehir": ("#FF6600", "#1B3F94"),
    "kasımpaşa": ("#003C7E", "#FFFFFF"),
    "konyaspor": ("#046A38", "#FFFFFF"),
    "rizespor": ("#0066B3", "#009E49"),
    "kayserispor": ("#FFD200", "#E30613"),
    "antalyaspor": ("#E30613", "#FFFFFF"),
    "alanyaspor": ("#FF7F00", "#009E49"),
    "sivasspor": ("#E30613", "#FFFFFF"),
    "gaziantep": ("#E30613", "#000000"),
    "hatayspor": ("#800000", "#FFFFFF"),
    "eyüpspor": ("#6A0DAD", "#FDB913"),
    "gençlerbirliği": ("#E30613", "#000000"),
    "kocaelispor": ("#046A38", "#000000"),
    "amed": ("#009E49", "#E30613"),
}
DEFAULT_COLORS = ("#0B1F3A", "#E5E7EB")


def _team_colors(name: str):
    low = (name or "").lower()
    for anahtar, renkler in TEAM_COLORS.items():
        if anahtar in low:
            return renkler
    return DEFAULT_COLORS


# ------------------------------------------------------------------ prompt
# Skorlu kartlar (devre arası / maç sonu / tanıtım). Kullanıcı ENERJİK stili
# seçti (18.08): 3D metalik yazı, stadyum ışık patlaması, takım renkleri,
# hareket. Sade/editoryal yön reddedildi.
_STYLE = (
    "Premium high-energy football scoreboard graphic for sports social media. "
    "Dramatic night stadium with bright floodlight burst, glowing atmosphere, "
    "energy light streaks, particles, dynamic depth and motion. Bold "
    "cinematic 3D metallic condensed typography with strong glow and depth. "
    "Split-color dynamic diagonal composition with glowing edge. Professional "
    "sports broadcast template, crisp sharp lettering, vivid high contrast, "
    "exciting. "
    "IMPORTANT: no club logos, crests, badges or emblems; no watermark; "
    "no random extra text."
)


_GOAL_STYLE = (
    "Explosive football GOAL announcement graphic for sports social media. "
    "Dramatic stadium floodlight burst, energy streaks, particles, motion "
    "blur, deep atmospheric depth. Massive italic condensed 3D typography "
    "with glow as the hero element. Professional sports club template "
    "quality, crisp sharp lettering, cinematic high energy. "
    "IMPORTANT: do NOT draw any club logos, crests, badges or emblems. "
    "No watermarks, no random extra text, no icons."
)

_GOAL_HERO = {
    "goal": "GOL!",
    "goal_late": "GOL!",
    "penalty_goal": "PENALTIDAN GOL!",
    "own_goal": "KENDİ KALESİNE!",
    "hat_trick": "HAT-TRICK!",
    "brace": "İKİNCİ GOL!",
}


def build_prompt(kind: str, home: str, away: str, home_score, away_score,
                 league: str, player: str = "", minute: str = "",
                 scoring_team: str = "") -> str:
    from app.content_engine.textutil import clean_team_name
    home = clean_team_name(home)
    away = clean_team_name(away)
    c1, _ = _team_colors(home)
    c2, _ = _team_colors(away)

    # --- GOL kartı: golcü + skor kahraman, arka plan atan takımın rengi
    if kind in GOAL_KINDS:
        tc, _ = _team_colors(scoring_team or home)
        hero = _GOAL_HERO.get(kind, "GOL!")
        alt = f"{player.upper()}" + (f" {minute}'" if minute else "") if player else ""
        skor = f"{home.upper()} {home_score} - {away_score} {away.upper()}"
        metin = (
            f"Dominant background color {tc}. "
            f"Huge hero typography exactly reading: \"{hero}\". "
            + (f"Below it bold text exactly: \"{alt}\". " if alt else "")
            + f"Smaller line exactly: \"{skor}\". "
        )
        return _GOAL_STYLE + " " + metin

    # --- Skorlu kartlar (ft/ht) ve tanıtım
    renk = (f"Left half in {c1} representing {home}, right half in {c2} "
            f"representing {away}, separated by a dynamic diagonal cut. ")
    if kind == "ft":
        baslik, skor = "MAÇ SONUCU", f"{home_score} - {away_score}"
    elif kind == "ht":
        baslik, skor = "İLK YARI", f"{home_score} - {away_score}"
    else:  # preview
        baslik, skor = "BUGÜN", "VS"
    metin = (
        f"Centered huge condensed bold uppercase typography exactly reading: "
        f"\"{home.upper()} {skor} {away.upper()}\" with the middle part extra "
        f"large. Above it a small elegant label exactly: \"{baslik}\". "
        f"Below it smaller text exactly: \"{league.upper()}\". "
    )
    return _STYLE + " " + renk + metin


# ------------------------------------------------------------------ üretim
def generate(db: Session, prompt: str, timeout_s: int = 150) -> str | None:
    """Görseli üretir, CDN URL'sini döner. Hata/zaman aşımı: None."""
    api_key = crud.get_setting(db, "wiro_api_key", "")
    if not api_key:
        return None
    headers = {"x-api-key": api_key, "Content-Type": "application/json"}
    try:
        r = httpx.post(f"{BASE}/Run/{MODEL}", headers=headers, timeout=60,
                       json={"prompt": prompt, "resolution": "1k",
                             "aspectRatio": "16:9", "watermark": "false"})
        tid = r.json().get("taskid")
        if not tid:
            crud.add_log(db, f"Wiro görev açılamadı: {r.text[:120]}",
                         level="warn", source="imagegen")
            return None
        basla = time.time()
        while time.time() - basla < timeout_s:
            time.sleep(5)
            rr = httpx.post(f"{BASE}/Task/Detail", headers=headers,
                            json={"taskid": tid}, timeout=30)
            gorevler = rr.json().get("tasklist") or [{}]
            t = gorevler[0]
            durum = str(t.get("status", ""))
            if "postprocess_end" in durum:
                cikti = t.get("outputs") or []
                if cikti and cikti[0].get("url"):
                    return cikti[0]["url"]
                return None
            if durum.lower() in ("failed", "error", "task_error"):
                crud.add_log(db, "Wiro görsel üretimi başarısız",
                             level="warn", source="imagegen")
                return None
        crud.add_log(db, "Wiro görsel üretimi zaman aşımı",
                     level="warn", source="imagegen")
    except Exception as e:
        crud.add_log(db, f"Wiro hatası: {e}", level="warn", source="imagegen")
    return None


def _todays_image_count(db: Session) -> int:
    from datetime import datetime
    from app.core import timeutil
    bas, _ = timeutil.tr_day_bounds_utc()
    return (db.query(models.Post)
            .filter(models.Post.media_source_url.like("%wiro.ai%"),
                    models.Post.created_at >= bas).count())


def fill_queued_images(db: Session) -> int:
    """Kuyruktaki görselsiz kartlara görsel üretir (scheduler işi).

    Tek seferde EN FAZLA BİR görsel üretilir (üretim ~80 sn sürüyor;
    scheduler işini uzun süre bloklamamak için). Sıradaki kart bir sonraki
    turda alınır — dispatcher zaten IMAGE_WAIT_MIN boyunca bekliyor.
    """
    if crud.get_setting(db, "images_enabled", "true") != "true":
        return 0
    # Paylaşım kapalıyken görsel üretme: kart gönderilmeyecek, boşuna Wiro
    # kotası ve para harcanır (18.08 gece: hesap 344 ile kapalıyken maç sonu
    # kartları üretiliyordu).
    if crud.get_setting(db, "posting_enabled", "false") != "true":
        return 0
    if not crud.get_setting(db, "wiro_api_key", ""):
        return 0
    gunluk_tavan = int(crud.get_setting(db, "images_per_day", "20") or 20)
    if _todays_image_count(db) >= gunluk_tavan:
        return 0

    p = (db.query(models.Post)
         .filter(models.Post.status.in_(["queued", "approved"]),
                 models.Post.kind.in_(IMAGE_KINDS),
                 models.Post.media_source_url == "",
                 models.Post.match_id != None)  # noqa: E711
         .order_by(models.Post.id)
         .first())
    if not p:
        return 0

    m = db.get(models.Match, p.match_id)
    if not m:
        return 0
    lig = m.league.name if m.league else "Futbol"
    # Gol kartı için golcü/dakika/atan takım olaydan alınır
    player = minute = scoring_team = ""
    if p.kind in GOAL_KINDS and p.event_id:
        e = db.get(models.MatchEvent, p.event_id)
        if e:
            player, minute, scoring_team = e.player or "", e.minute or "", e.team or ""
    prompt = build_prompt(p.kind, m.home_team, m.away_team,
                          m.home_score if m.home_score is not None else "",
                          m.away_score if m.away_score is not None else "",
                          lig, player=player, minute=minute,
                          scoring_team=scoring_team)
    url = generate(db, prompt)
    if url:
        p.media_source_url = url
        db.commit()
        crud.add_log(db, f"Görsel üretildi [{p.kind}] "
                         f"{m.home_team}-{m.away_team}", source="imagegen")
        return 1
    # üretilemedi: bir daha denenmesin diye işaretle (metin olarak gider)
    p.media_source_url = "skip"
    db.commit()
    return 0
