from pathlib import Path

from sqlalchemy import create_engine, event
from sqlalchemy.engine import Engine
from sqlalchemy.orm import DeclarativeBase, sessionmaker

from .config import settings


is_sqlite = settings.database_url.startswith("sqlite")
engine_kwargs = {
    "pool_pre_ping": True,
}

if is_sqlite:
    connect_args = {
        "check_same_thread": False,
        "timeout": 30,
    }
else:
    connect_args = {}
    engine_kwargs.update(
        {
            "pool_recycle": 280,
            "pool_size": 5,
            "max_overflow": 5,
        }
    )

engine = create_engine(
    settings.database_url,
    connect_args=connect_args,
    **engine_kwargs,
)


if is_sqlite:
    @event.listens_for(Engine, "connect")
    def configure_sqlite(dbapi_connection, _connection_record):
        cursor = dbapi_connection.cursor()
        cursor.execute("PRAGMA foreign_keys=ON")
        cursor.execute("PRAGMA journal_mode=WAL")
        cursor.execute("PRAGMA busy_timeout=30000")
        cursor.close()


SessionLocal = sessionmaker(
    bind=engine,
    autoflush=False,
    autocommit=False,
    expire_on_commit=False,
)


class Base(DeclarativeBase):
    pass


def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()
