"""Provider selection. The one place a model or vendor swap happens.

`CP_TRANSCRIPTION_PROVIDER` picks the implementation (default: gemini) and
`CP_TRANSCRIBE_MODEL` picks the model within it. Adding a vendor means adding
a module under `providers/` and one line to `_PROVIDERS` - no route, service,
or frontend change.
"""

from __future__ import annotations

from functools import lru_cache

from app.config import get_settings
from app.services.ai.providers.base import TranscriptionProvider
from app.services.ai.providers.gemini import GeminiTranscriptionProvider

_PROVIDERS: dict[str, type] = {
    GeminiTranscriptionProvider.name: GeminiTranscriptionProvider,
}


@lru_cache
def get_transcription_provider() -> TranscriptionProvider:
    name = (get_settings().transcription_provider or "gemini").strip().lower()
    provider = _PROVIDERS.get(name)
    if provider is None:
        known = ", ".join(sorted(_PROVIDERS))
        raise RuntimeError(
            f"Unknown transcription provider {name!r}. Known providers: {known}"
        )
    return provider()
