"""Hafif şema göçü.

`Base.metadata.create_all` yalnızca EKSİK TABLOLARI oluşturur; var olan bir
tabloya yeni sütun eklemez. Kullanıcının hesabı/anahtarı zaten DB'de olduğu
için tabloyu silip yeniden kurmak veri kaybı demek. Bu yüzden eksik sütunlar
ALTER TABLE ile eklenir (SQLite ADD COLUMN destekler).
"""
import logging
from sqlalchemy import text

log = logging.getLogger("db.migrate")

# tablo -> [(sütun adı, SQL tipi + varsayılan), ...]
COLUMNS = {
    "matches": [
        ("thread_tweet_id", "VARCHAR(40) DEFAULT ''"),
        ("last_tweet_id", "VARCHAR(40) DEFAULT ''"),
        ("hashtag", "VARCHAR(40) DEFAULT ''"),
    ],
    "leagues": [
        ("coverage", "VARCHAR(20) DEFAULT 'auto'"),
    ],
    "posts": [
        ("reply_to_post_id", "INTEGER"),
        ("is_reply", "BOOLEAN DEFAULT 0"),
        ("quote_url", "TEXT DEFAULT ''"),
        ("media_source_url", "TEXT DEFAULT ''"),
    ],
    "news_items": [
        ("full_text", "TEXT DEFAULT ''"),
    ],
    "source_tweets": [
        ("media_url", "TEXT DEFAULT ''"),
        ("score", "INTEGER DEFAULT 0"),
        ("retweets", "INTEGER DEFAULT 0"),
        ("likes", "INTEGER DEFAULT 0"),
    ],
}


def _existing_columns(conn, table: str) -> set:
    rows = conn.execute(text(f"PRAGMA table_info({table})")).fetchall()
    return {r[1] for r in rows}


def run(engine):
    """Eksik sütunları ekler. Zaten varsa hiçbir şey yapmaz."""
    added = []
    with engine.begin() as conn:
        for table, cols in COLUMNS.items():
            # tablo henüz yoksa create_all oluşturacak, atla
            exists = conn.execute(text(
                "SELECT name FROM sqlite_master WHERE type='table' AND name=:t"
            ), {"t": table}).first()
            if not exists:
                continue
            have = _existing_columns(conn, table)
            for name, ddl in cols:
                if name in have:
                    continue
                conn.execute(text(f"ALTER TABLE {table} ADD COLUMN {name} {ddl}"))
                added.append(f"{table}.{name}")
    if added:
        log.info("Şema güncellendi: %s", ", ".join(added))
    return added
