# utils/database.py
"""Database utilities for database operations.

This module provides utility functions and classes to interact with a database using SQLAlchemy. It includes:
- Creating a database engine with connection pooling.
- Generating a session factory for creating sessions.
"""

import logging

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.pool import QueuePool

logger = logging.getLogger(__name__)


def get_db_engine(database_url: str):
    """Create a database engine with connection pooling.

    Args:
        database_url (str): The URL string to connect to the database. It can be for SQLite or PostgreSQL databases.

    Returns:
        sqlalchemy.engine.Engine: A SQLAlchemy Engine instance configured according to the provided database URL.
    """
    if database_url.startswith("sqlite"):
        # Configuration for SQLite database
        engine = create_engine(
            database_url, connect_args={"check_same_thread": False}, echo=False
        )
    else:
        # Configuration for PostgreSQL databases with connection pooling
        engine = create_engine(
            database_url,
            poolclass=QueuePool,
            pool_size=10,
            max_overflow=20,
            pool_pre_ping=True,
            echo=False,
        )

    logger.info(f"Database engine created for: {database_url.split('@')[0]}@...")
    return engine


def get_session_local(engine):
    """Create a session factory to generate database sessions.

    Args:
        engine (sqlalchemy.engine.Engine): The SQLAlchemy Engine instance created by `get_db_engine`.

    Returns:
        sqlalchemy.orm.sessionmaker: A session factory bound to the provided engine, suitable for creating database sessions.
    """
    return sessionmaker(autocommit=False, autoflush=False, bind=engine)
