"""SQLAlchemy 2.0 engine + session factory (sync — see react.md:
sync `def` routes for DB work; FastAPI runs them in a threadpool)."""

from collections.abc import Iterator
from functools import lru_cache

from sqlalchemy import Engine, create_engine
from sqlalchemy.orm import Session

from app.config import settings


@lru_cache(maxsize=1)
def get_engine() -> Engine:
    if not settings.with_db_url:
        raise RuntimeError("WITH_DB_URL is not set")
    return create_engine(
        settings.with_db_url,
        pool_pre_ping=True,
        connect_args={"connect_timeout": 3},
    )


def get_session() -> Iterator[Session]:
    """FastAPI dependency — one Session per request (M2+ routers)."""
    with Session(get_engine()) as session:
        yield session
