"""
Database configuration for TripTalley.
"""

import os
from typing import AsyncGenerator

from sqlalchemy import AsyncAdaptedQueuePool
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
from sqlalchemy.orm import sessionmaker

from app.core.config import settings

# Create async engine
engine = create_async_engine(
    settings.DATABASE_URL,
    echo=settings.DEBUG,
    pool_pre_ping=True,
    pool_size=settings.DATABASE_POOL_SIZE,
    max_overflow=settings.DATABASE_MAX_OVERFLOW,
    poolclass=AsyncAdaptedQueuePool,
)

# Create async session factory
async_session = sessionmaker(
    engine,
    class_=AsyncSession,
    expire_on_commit=False,
    autocommit=False,
    autoflush=False,
)


async def get_db() -> AsyncGenerator[AsyncSession, None]:
    """
    Dependency for getting database sessions.
    
    Usage:
        @router.get("/items")
        async def read_items(db: AsyncSession = Depends(get_db)):
            ...
    """
    async with async_session() as session:
        try:
            yield session
        finally:
            await session.close()


# Database URL construction helpers
def build_database_url(
    driver: str = "aiosqlite",
    username: str = None,
    password: str = None,
    host: str = "localhost",
    port: int = None,
    database: str = "triptalley.db"
) -> str:
    """
    Build a database URL from components.
    
    For SQLite (async):
        aiosqlite:///./triptalley.db
    
    For PostgreSQL (async):
        postgresql+asyncpg://user:pass@localhost:5432/dbname
    """
    if driver == "aiosqlite":
        return f"sqlite+{driver}:///./{database}"
    
    if driver == "postgresql+asyncpg":
        url = f"postgresql+{driver}://"
        if username:
            url += username
        if password:
            url += f":{password}"
        if username or password:
            url += "@"
        url += host
        if port:
            url += f":{port}"
        url += f"/{database}"
        return url
    
    raise ValueError(f"Unsupported driver: {driver}")