"""Wrapper isolado para o LLM.

O fornecedor atual é a Groq, mas a integração está isolada para permitir
trocar de fornecedor sem alterar o resto do sistema (CONTEXT.md, secção 26).

O LLM NÃO decide o percurso do estudante — o motor adaptativo baseado em
regras mantém a decisão previsível e auditável (CONTEXT.md, secção 19).
O LLM é usado apenas para enriquecer a comunicação (ex.: justificação
personalizada de uma recomendação já selecionada por regras).
"""

import logging

from django.conf import settings

logger = logging.getLogger(__name__)


class LLMUnavailableError(RuntimeError):
    """Sem chave API configurada ou falha no fornecedor."""


class LLMService:
    def __init__(self):
        self._client = None
        self.api_key = settings.GROQ_API_KEY
        self.model = settings.GROQ_MODEL

    def is_available(self) -> bool:
        return bool(self.api_key)

    def _get_client(self):
        if self._client is None:
            from groq import Groq

            self._client = Groq(api_key=self.api_key)
        return self._client

    def chat(
        self,
        system_prompt: str,
        user_prompt: str,
        temperature: float = 0.7,
        max_tokens: int = 300,
    ) -> str:
        """Envia um pedido de chat e devolve o texto de resposta."""
        if not self.is_available():
            raise LLMUnavailableError("GROQ_API_KEY não configurada.")

        try:
            response = self._get_client().chat.completions.create(
                model=self.model,
                messages=[
                    {"role": "system", "content": system_prompt},
                    {"role": "user", "content": user_prompt},
                ],
                temperature=temperature,
                max_tokens=max_tokens,
            )
        except Exception as exc:  # rede, quota, API... — não derruba a app
            logger.warning("Falha no LLM (Groq): %s", exc)
            raise LLMUnavailableError(str(exc)) from exc

        content = response.choices[0].message.content
        return content.strip() if content else ""


llm_service = LLMService()
