"""SQLAlchemy motoru ve oturum yönetimi (SQLite)."""
from sqlalchemy import create_engine, event
from sqlalchemy.orm import sessionmaker, declarative_base
import config

engine = create_engine(
    config.DB_URL,
    connect_args={"check_same_thread": False, "timeout": 20},
    future=True,
)


@event.listens_for(engine, "connect")
def _sqlite_pragmas(dbapi_conn, _record):
    """Scheduler thread'leri ile web istekleri aynı anda DB'ye erişiyor.
    WAL: okuyucular yazarı bloklamaz. busy_timeout: kilit varsa hata yerine bekle."""
    cur = dbapi_conn.cursor()
    cur.execute("PRAGMA journal_mode=WAL")
    cur.execute("PRAGMA busy_timeout=20000")
    cur.execute("PRAGMA synchronous=NORMAL")
    cur.close()
SessionLocal = sessionmaker(bind=engine, autoflush=False, autocommit=False, future=True)
Base = declarative_base()


def get_session():
    """FastAPI bağımlılığı: istek başına bir DB oturumu."""
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()


def init_db():
    """Tabloları oluştur ve başlangıç verilerini ekle."""
    from app.db import models  # noqa: F401 - modellerin kayıtlı olması için
    from app.db import migrate
    Base.metadata.create_all(bind=engine)
    migrate.run(engine)          # var olan tablolara eksik sütunları ekle
    _seed_defaults()


def _seed_defaults():
    from app.db import models, crud
    db = SessionLocal()
    try:
        crud.ensure_default_settings(db)
        crud.ensure_default_leagues(db)
        crud.ensure_default_sources(db)
        db.commit()
    finally:
        db.close()
