# agent/brain.py — Cerveau de l'agent : connexion à Claude API
# Généré par AgentKit

import os
import yaml
import logging
from anthropic import AsyncAnthropic
from dotenv import load_dotenv

load_dotenv()
logger = logging.getLogger("agentkit")

client = AsyncAnthropic(api_key=os.getenv("ANTHROPIC_API_KEY"))


def cargar_config_prompts() -> dict:
    """Lit toute la configuration depuis config/prompts.yaml."""
    try:
        with open("config/prompts.yaml", "r", encoding="utf-8") as f:
            return yaml.safe_load(f) or {}
    except FileNotFoundError:
        logger.error("config/prompts.yaml non trouvé")
        return {}


def cargar_system_prompt() -> str:
    """Lit le system prompt depuis config/prompts.yaml."""
    config = cargar_config_prompts()
    return config.get("system_prompt", "Tu es un assistant utile. Réponds en français.")


def obtener_mensaje_error() -> str:
    config = cargar_config_prompts()
    return config.get("error_message", "Je rencontre un problème technique. Merci de réessayer.")


def obtener_mensaje_fallback() -> str:
    config = cargar_config_prompts()
    return config.get("fallback_message", "Désolé, je n'ai pas compris. Pouvez-vous reformuler ?")


async def generar_respuesta(mensaje: str, historial: list[dict]) -> str:
    """
    Génère une réponse via Claude API.

    Args:
        mensaje: Le nouveau message de l'utilisateur
        historial: Liste des messages précédents [{"role": "user/assistant", "content": "..."}]

    Returns:
        La réponse générée par Claude
    """
    if not mensaje or len(mensaje.strip()) < 2:
        return obtener_mensaje_fallback()

    system_prompt = cargar_system_prompt()

    mensajes = []
    for msg in historial:
        mensajes.append({"role": msg["role"], "content": msg["content"]})

    mensajes.append({"role": "user", "content": mensaje})

    try:
        response = await client.messages.create(
            model="claude-sonnet-4-6",
            max_tokens=1024,
            system=system_prompt,
            messages=mensajes
        )

        respuesta = response.content[0].text
        logger.info(f"Réponse générée ({response.usage.input_tokens} in / {response.usage.output_tokens} out)")
        return respuesta

    except Exception as e:
        logger.error(f"Erreur Claude API : {e}")
        return obtener_mensaje_error()
