from sqlmodel import SQLModel, create_engine, Session
from typing import Generator

from app.core.config import get_settings
from app.core.logging import setup_logger

logger = setup_logger(__name__)

settings = get_settings()

def get_engine():
    """Create DB engine with proper handling for SQLite vs production databases."""
    logger.info("Initializing database engine...")
    kwargs = {
        "echo": False,
    }
    if settings.DATABASE_URL.startswith("sqlite"):
        logger.debug("Detected SQLite database; applying 'check_same_thread=False'.")
        kwargs["connect_args"] = {"check_same_thread": False}
    try:
        engine = create_engine(settings.DATABASE_URL, **kwargs)
        logger.info("Database engine created successfully.")
        return engine
    except Exception as e:
        logger.exception(f"Failed to create engine for database URL: {settings.DATABASE_URL}")
        raise

engine = get_engine()

def init_db() -> None:
    """Creates all tables (safe for local dev; in prod use Alembic)."""
    logger.info("Creating database tables...")
    try:
        SQLModel.metadata.create_all(engine)
        logger.info("Tables created.")
    except Exception as e:
        logger.exception("Error creating database tables.")
        raise

def get_session() -> Generator[Session, None, None]:
    """FastAPI dependency that provides a SQLModel session."""
    try:
        with Session(engine) as session:
            yield session
    except Exception as e:
        logger.exception("Database session encountered an error.")
        raise
