"""Veritabanı modelleri. Faz 1 için tümü tanımlı; sonraki fazlar bu tabloları doldurur."""
from datetime import datetime
from sqlalchemy import (
    Column, Integer, String, Text, Boolean, DateTime, Float, ForeignKey,
)
from sqlalchemy.orm import relationship
from app.db.database import Base


class Setting(Base):
    """Anahtar-değer ayarlar. Hassas değerler (deepseek_api_key) şifreli saklanır."""
    __tablename__ = "settings"
    key = Column(String(64), primary_key=True)
    value = Column(Text, default="")
    is_secret = Column(Boolean, default=False)
    updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)


class Account(Base):
    """X (Twitter) hesabı. Cookie'ler (auth_token, ct0) şifreli tutulur."""
    __tablename__ = "accounts"
    id = Column(Integer, primary_key=True)
    label = Column(String(80), nullable=False)          # panelde görünen ad
    username = Column(String(80), default="")           # @kullanici
    auth_token_enc = Column(Text, default="")           # şifreli
    ct0_enc = Column(Text, default="")                  # şifreli
    is_active = Column(Boolean, default=True)           # rotasyona dahil mi
    status = Column(String(20), default="unknown")      # ok | suspended | error | unknown
    last_checked = Column(DateTime, nullable=True)
    last_error = Column(Text, default="")
    notes = Column(Text, default="")
    created_at = Column(DateTime, default=datetime.utcnow)


class League(Base):
    """Takip edilen lig/turnuva. enabled ile aç/kapa."""
    __tablename__ = "leagues"
    id = Column(Integer, primary_key=True)
    key = Column(String(40), unique=True, nullable=False)   # dahili anahtar: super_lig
    name = Column(String(120), nullable=False)              # Trendyol Süper Lig
    country = Column(String(60), default="")
    provider = Column(String(30), default="sofascore")      # veri kaynağı
    provider_id = Column(String(40), default="")            # kaynaktaki turnuva id
    priority = Column(Integer, default=5)                   # 1=en yüksek
    enabled = Column(Boolean, default=True)
    # Anlatım yoğunluğu: auto | full | standard | minimal
    # Aynı anda onlarca maç oynanabildiği için her maçı dakika dakika
    # anlatmak hem imkânsız hem spam. Bkz. scheduler/coverage.py
    coverage = Column(String(20), default="auto")


class Match(Base):
    """Fikstür + canlı durum. Faz 2'de doldurulur."""
    __tablename__ = "matches"
    id = Column(Integer, primary_key=True)
    league_id = Column(Integer, ForeignKey("leagues.id"), nullable=True)
    provider = Column(String(30), default="sofascore")
    provider_match_id = Column(String(40), index=True)
    home_team = Column(String(120), default="")
    away_team = Column(String(120), default="")
    home_score = Column(Integer, nullable=True)
    away_score = Column(Integer, nullable=True)
    status = Column(String(20), default="scheduled")   # scheduled|live|ht|finished
    kickoff = Column(DateTime, nullable=True)
    last_synced = Column(DateTime, nullable=True)
    # Canlı anlatım thread'i: ilk tweet kök, sonraki olaylar ona zincirlenir.
    thread_tweet_id = Column(String(40), default="")    # thread kökü
    last_tweet_id = Column(String(40), default="")      # zincirin son halkası
    # Yayıncının o maç için kullandığı resmi etiket (#BJKvEYP). Tahmin
    # EDİLMEZ — kodlar kurala uymuyor (Beşiktaş→BJK, Eyüpspor→EYP), uydurulan
    # etiket hiçbir konuşmaya bağlanmaz. İzlenen hesaplardan öğrenilir.
    hashtag = Column(String(40), default="")

    league = relationship("League")


class MatchEvent(Base):
    """Bir maçtaki olay (gol, kart, penaltı, devre...). Tweet üretimini tetikler."""
    __tablename__ = "match_events"
    id = Column(Integer, primary_key=True)
    match_id = Column(Integer, ForeignKey("matches.id"), index=True)
    event_type = Column(String(30))       # goal|card|penalty|lineup|ht|ft|kickoff
    minute = Column(String(10), default="")
    team = Column(String(120), default="")
    player = Column(String(120), default="")
    detail = Column(Text, default="")
    dedup_key = Column(String(120), index=True)   # aynı olayı iki kez işlememek için
    tweeted = Column(Boolean, default=False)
    created_at = Column(DateTime, default=datetime.utcnow)


class Post(Base):
    """Tweet kuyruğu ve geçmişi."""
    __tablename__ = "posts"
    id = Column(Integer, primary_key=True)
    account_id = Column(Integer, ForeignKey("accounts.id"), nullable=True)
    match_id = Column(Integer, ForeignKey("matches.id"), nullable=True)
    event_id = Column(Integer, ForeignKey("match_events.id"), nullable=True)
    content = Column(Text, nullable=False)
    kind = Column(String(30), default="event")   # event|preview|summary|manual|news
    status = Column(String(20), default="queued")  # queued|approved|posted|failed|cancelled
    scheduled_at = Column(DateTime, nullable=True)
    posted_at = Column(DateTime, nullable=True)
    tweet_id = Column(String(40), default="")
    error = Column(Text, default="")
    created_at = Column(DateTime, default=datetime.utcnow)
    # Thread desteği: başka bir Post'un altına yanıt olarak gider
    # (hedefin tweet_id'si gönderim anında çözülür).
    reply_to_post_id = Column(Integer, nullable=True)
    # Ana akışa değil, bir thread'in içine gidiyor -> daha hızlı tempo hakkı
    is_reply = Column(Boolean, default=False)
    # Alıntı tweet: hedef gönderi gömülü görünür (telif açısından güvenli yol —
    # içerik çoğaltılmaz, kaynak görünür kalır). Bkz. x_engine/sources.py
    quote_url = Column(Text, default="")
    # Gönderim anında indirilip tweete eklenecek görsel (pbs.twimg.com).
    # Fotoğraflı kaynaklarda link/kart yerine görselin kendisi paylaşılır
    # (kullanıcı kararı). Video için KULLANILMAZ — video linkle paylaşılır.
    media_source_url = Column(Text, default="")

    account = relationship("Account")


class NewsItem(Base):
    """RSS'ten çekilen haber. url_hash ile tekrar önlenir."""
    __tablename__ = "news_items"
    id = Column(Integer, primary_key=True)
    source = Column(String(60), default="")        # ASpor, Hürriyet...
    title = Column(Text, default="")
    summary = Column(Text, default="")
    full_text = Column(Text, default="")   # makalenin çıkarılmış tam metni
    url = Column(Text, default="")
    url_hash = Column(String(64), unique=True, index=True)
    category = Column(String(30), default="news")  # news | transfer
    score = Column(Integer, default=0)             # alaka puanı
    published_at = Column(DateTime, nullable=True)
    tweeted = Column(Boolean, default=False)
    skipped = Column(Boolean, default=False)       # alakasız bulundu
    created_at = Column(DateTime, default=datetime.utcnow)


class SourceAccount(Base):
    """İçerik kaynağı olarak izlenen X hesabı (ör. resmi yayıncı).

    Bu hesapların videolarını kendi hesabımıza YÜKLEMEYİZ (telif). Yalnızca
    tweet'lerini ALINTILAR, üstüne kendi yorumumuzu yazarız — kaynak görünür
    kalır, hiçbir içerik çoğaltılmaz.
    """
    __tablename__ = "source_accounts"
    id = Column(Integer, primary_key=True)
    handle = Column(String(60), unique=True, nullable=False)   # beINSPORTS_TR
    label = Column(String(120), default="")
    user_id = Column(String(40), default="")     # X sayısal id (önbellek)
    enabled = Column(Boolean, default=True)
    auto_quote = Column(Boolean, default=False)  # otomatik alıntı yapılsın mı
    last_seen_id = Column(String(40), default="")
    last_checked = Column(DateTime, nullable=True)
    last_error = Column(Text, default="")
    created_at = Column(DateTime, default=datetime.utcnow)


class SourceTweet(Base):
    """İzlenen hesaptan çekilen tweet. Alıntılanmaya aday içerik."""
    __tablename__ = "source_tweets"
    id = Column(Integer, primary_key=True)
    source_id = Column(Integer, ForeignKey("source_accounts.id"), index=True)
    handle = Column(String(60), default="")
    tweet_id = Column(String(40), unique=True, index=True)
    text = Column(Text, default="")
    media = Column(String(40), default="")        # video | photo | ""
    media_url = Column(Text, default="")          # pbs.twimg.com görsel adresi (photo)
    kind = Column(String(20), default="other")    # goal | action | promo | studio ...
    # Önem sıralaması: aynı anda çok aday olduğunda en iyileri seçmek için.
    # Bkz. x_engine/importance.py
    score = Column(Integer, default=0)
    retweets = Column(Integer, default=0)         # kaynağın kendi etkileşimi
    likes = Column(Integer, default=0)
    match_id = Column(Integer, ForeignKey("matches.id"), nullable=True)
    posted_at = Column(DateTime, nullable=True)   # kaynak tweet'in zamanı
    used = Column(Boolean, default=False)         # alıntılandı/işlendi
    skipped = Column(Boolean, default=False)
    created_at = Column(DateTime, default=datetime.utcnow)

    source = relationship("SourceAccount")
    match = relationship("Match")

    @property
    def url(self) -> str:
        return f"https://x.com/{self.handle}/status/{self.tweet_id}"

    @property
    def video_url(self) -> str:
        """Medyaya doğrudan link (/video/1 veya /photo/1).

        Tweetimizde ALINTI KARTI değil bu link kullanılır: kart kaynağın
        gönderisini olduğu gibi gömüyor ve bizim tweetimiz onun tekrarı gibi
        duruyordu. Düz status linki ise X tarafından ya reddediliyor (kod 344)
        ya da karta çevriliyor; /video/1 biçimi kabul ediliyor ve kart
        oluşturmuyor (canlı test edildi). Fotoğraflı gönderiler için aynı
        ailedeki /photo/1 kullanılır.
        """
        if self.media == "video":
            return f"{self.url}/video/1"
        # Fotoğraf için LİNK KULLANILMAZ: düz status linki alıntı kartına
        # dönüşüyor. Görselin kendisi indirilip kendi tweetimize eklenir
        # (SourceTweet.media_url -> Post.media_source_url).
        return ""


class LogEntry(Base):
    """Genel sistem/işlem logları — panelde gösterilir."""
    __tablename__ = "logs"
    id = Column(Integer, primary_key=True)
    level = Column(String(10), default="info")   # info|warn|error
    source = Column(String(40), default="")      # x_engine|data|content|scheduler
    message = Column(Text, default="")
    created_at = Column(DateTime, default=datetime.utcnow)
