"""Initialisation de la base de données SQLite."""
import os
from pathlib import Path
from sqlmodel import create_engine, Session, SQLModel
from sqlalchemy import text

# DB_FILE peut être surchargé par variable d'environnement (utile en Docker)
DB_FILE = Path(os.getenv("DB_FILE", "cave.db"))
DATABASE_URL = f"sqlite:///{DB_FILE}"

engine = create_engine(
    DATABASE_URL,
    echo=False,
    connect_args={"check_same_thread": False},
)


def init_db():
    """Crée les tables si elles n'existent pas encore."""
    SQLModel.metadata.create_all(engine)


def migrate_db():
    """Ajoute les nouvelles colonnes sans casser les données existantes."""
    with engine.connect() as conn:
        # Colonnes bouteille
        for col, typedef in [
            ("cave_id", "INTEGER"),
            ("etagere", "INTEGER"),
            ("position", "INTEGER"),
            ("sous_type", "TEXT"),
            ("designation", "TEXT"),
            ("classification", "TEXT"),
        ]:
            try:
                conn.execute(text(f"ALTER TABLE bouteille ADD COLUMN {col} {typedef}"))
            except Exception:
                pass
        # Colonnes cave (nouvelles)
        for col, typedef in [
            ("type", "TEXT DEFAULT 'rayonnage'"),
            ("temperature", "REAL"),
        ]:
            try:
                conn.execute(text(f"ALTER TABLE cave ADD COLUMN {col} {typedef}"))
            except Exception:
                pass

        # 1 emplacement = 1 bouteille : libère les emplacements de toute référence
        # en quantité > 1 assignée avant l'introduction de cette règle.
        conn.execute(text(
            "UPDATE bouteille SET etagere = NULL, position = NULL "
            "WHERE quantite != 1 AND etagere IS NOT NULL"
        ))
        conn.commit()


def get_session():
    """Dépendance FastAPI : fournit une session par requête."""
    with Session(engine) as session:
        yield session
