from collections.abc import Generator
from sqlalchemy import create_engine
from sqlalchemy.orm import DeclarativeBase, Session, sessionmaker
from app.config import settings

engine = create_engine(settings.DATABASE_URL, connect_args={"check_same_thread": False})  # connect_args={"check_same_thread": False} is required ONLY for SQLite
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

class Base(DeclarativeBase):  # Modern SQLAlchemy 2.0 Base Class
    pass

def get_db() -> Generator[Session, None, None]:  # Explicitly typed Database Session Generator
    """FastAPI dependency that yields a database session and ensures it is closed."""
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()