"""Factory + реестр для реализаций плагинов Transcriber/Summarizer."""

from core.plugins.config import SummarizerConfig, TranscriberConfig
from core.plugins.summarizer import Summarizer
from core.plugins.transcriber import Transcriber


class PluginError(Exception):
    """Базовая ошибка при сбое реестра/factory плагинов."""


class UnknownProviderError(PluginError):
    """Вызывается, когда запрошенный `provider` плагина не зарегистрирован."""


_TRANSCRIBERS: dict[str, type[Transcriber]] = {}
_SUMMARIZERS: dict[str, type[Summarizer]] = {}


def register_transcriber[T: type[Transcriber]](cls: T) -> T:
    """Зарегистрировать подкласс `Transcriber` под его ключом `provider`."""
    _TRANSCRIBERS[cls.provider] = cls
    return cls


def register_summarizer[S: type[Summarizer]](cls: S) -> S:
    """Зарегистрировать подкласс `Summarizer` под его ключом `provider`."""
    _SUMMARIZERS[cls.provider] = cls
    return cls


def create_transcriber(cfg: TranscriberConfig) -> Transcriber:
    """Инстанцировать `Transcriber`, зарегистрированный для `cfg.provider`."""
    try:
        cls = _TRANSCRIBERS[cfg.provider]
    except KeyError as exc:
        raise UnknownProviderError(f"Неизвестный провайдер transcriber: {cfg.provider!r}") from exc
    return cls(model=cfg.model, language=cfg.language, **cfg.options)  # type: ignore[call-arg]


def create_summarizer(cfg: SummarizerConfig) -> Summarizer:
    """Инстанцировать `Summarizer`, зарегистрированный для `cfg.provider`."""
    try:
        cls = _SUMMARIZERS[cfg.provider]
    except KeyError as exc:
        raise UnknownProviderError(f"Неизвестный провайдер summarizer: {cfg.provider!r}") from exc
    return cls(model=cfg.model, chunk_minutes=cfg.chunk_minutes, **cfg.options)  # type: ignore[call-arg]
