"""Seleccion del proveedor de mensajeria."""

from __future__ import annotations

from collections.abc import Callable

from notifications.channels.messaging.base import MessagingProvider
from notifications.channels.messaging.console import ConsoleMessagingProvider
from notifications.channels.messaging.twilio_provider import TwilioProvider

_FACTORIES: dict[str, Callable[[], MessagingProvider]] = {
    TwilioProvider.name: TwilioProvider,
    ConsoleMessagingProvider.name: ConsoleMessagingProvider,
}


class UnknownProvider(Exception):
    """Se pidio un proveedor que no existe o no esta habilitado."""


def get_provider(name: str | None = None) -> MessagingProvider:
    """
    Devuelve una instancia del proveedor de mensajeria configurado.

    Lanza `UnknownProvider` si no existe. La comprobacion de configuracion es
    por canal y la hace quien envia, porque un mismo proveedor puede estar
    listo para SMS y no para WhatsApp.
    """
    from django.conf import settings

    name = (name or settings.MESSAGING_PROVIDER or "").strip().lower()

    if name not in _FACTORIES:
        raise UnknownProvider(f"El proveedor de mensajeria '{name}' no existe.")

    return _FACTORIES[name]()
