"""Process-level sync engine for Celery task modules.

Each task module used to call ``create_engine(...)`` on every invocation,
which leaked engines (and Postgres connections) — high-fire-rate tasks
like ``import_media_file`` would exhaust ``max_connections`` within
minutes during a bulk migration.

This module owns one engine per process. Celery prefork forks before any
task runs, so each worker process lazily initializes its own engine on
the first task and reuses it for the rest of its life.
"""

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

from ..config import get_config

_ENGINE = None
_SESSIONMAKER = None


def sync_session_factory():
    """Return a process-wide ``sessionmaker`` bound to a single engine."""
    global _ENGINE, _SESSIONMAKER
    if _SESSIONMAKER is None:
        cfg = get_config()
        _ENGINE = create_engine(
            cfg.database_url_sync,
            future=True,
            pool_pre_ping=True,
            pool_size=5,
            max_overflow=5,
            pool_recycle=300,
        )
        _SESSIONMAKER = sessionmaker(_ENGINE, expire_on_commit=False)
    return _SESSIONMAKER


def get_sync_engine():
    """The process-wide sync Engine — for raw work that needs a connection
    directly (e.g. AUTOCOMMIT VACUUM, which can't run inside a transaction)."""
    sync_session_factory()  # ensure _ENGINE is initialized
    return _ENGINE
