"""
Configurazione database – engine SQLAlchemy async e session factory.
"""

from collections.abc import AsyncGenerator

from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine
from sqlalchemy.orm import DeclarativeBase

from app.config import get_settings

settings = get_settings()

# Engine async con pool connection
engine = create_async_engine(
    settings.database_url,
    echo=settings.app_debug,          # log SQL in development
    pool_size=10,
    max_overflow=20,
    pool_pre_ping=True,               # verifica connessione prima di usarla
    pool_recycle=3600,                # ricicla connessioni ogni ora
)

# Session factory
AsyncSessionLocal = async_sessionmaker(
    bind=engine,
    class_=AsyncSession,
    expire_on_commit=False,
    autocommit=False,
    autoflush=False,
)


class Base(DeclarativeBase):
    """Base class per tutti i modelli SQLAlchemy."""
    pass


async def get_db() -> AsyncGenerator[AsyncSession, None]:
    """
    Dependency FastAPI: restituisce una sessione DB per ogni request.
    La sessione viene chiusa automaticamente al termine del request.
    """
    async with AsyncSessionLocal() as session:
        try:
            yield session
            await session.commit()
        except Exception:
            await session.rollback()
            raise
        finally:
            await session.close()
