"""Selection du backend LLM par nom (pluggable).

Calque de `tts/factory.py` : cache par (nom, reference de modele). Une
sauvegarde des reglages (settings.save_settings) appelle `reset_llm_cache()`
pour que les changements de backend/modele prennent effet sans redemarrage.
"""
from __future__ import annotations

from functools import lru_cache

from .base import LLMBackend

BACKENDS = ("mlx", "lmstudio")


@lru_cache(maxsize=4)
def get_llm_backend(backend: str = "mlx", model_ref: str = "") -> LLMBackend:
    backend = backend.lower()
    if backend == "mlx":
        from .mlx_backend import MLXBackend
        return MLXBackend(model_ref)
    if backend == "lmstudio":
        from .lmstudio_backend import LMStudioBackend
        return LMStudioBackend(model_ref)
    raise ValueError(
        f"Backend LLM inconnu: {backend!r} (dispo: {', '.join(BACKENDS)})")


def reset_llm_cache() -> None:
    """Vide les instances de backend et le cache de chargement mlx."""
    get_llm_backend.cache_clear()
    try:
        from .mlx_backend import _load
        _load.cache_clear()
    except Exception:  # noqa: BLE001
        pass
