from .base_agent import BaseAgent
from typing import Dict, Any
import logging
import json

logger = logging.getLogger("AgentJSONAnalyser")

class AgentJsonAnalyser(BaseAgent):
    """
    Agent pour analyser les tickets JSON et en extraire les informations importantes.
    """
    def __init__(self, llm):
        super().__init__("AgentJsonAnalyser", llm)
        
        # Configuration locale de l'agent (remplace AgentConfig)
        self.temperature = 0.1  # Besoin d'analyse très précise
        self.top_p = 0.8
        self.max_tokens = 1500
        self.system_prompt = """Tu es un expert en analyse de tickets pour le support informatique de BRG_Lab pour la société CBAO.
Ton rôle est d'extraire et d'analyser les informations importantes des tickets JSON.
Organise ta réponse avec les sections suivantes:
1. Résumé du problème
2. Informations techniques essentielles (logiciels, versions, etc.)
3. Contexte client (urgence, impact)
4. Pistes d'analyse suggérées

Sois précis, factuel et synthétique dans ton analyse."""
        
        # Appliquer la configuration au LLM
        self._appliquer_config_locale()
        
        logger.info("AgentJsonAnalyser initialisé")
    
    def _appliquer_config_locale(self) -> None:
        """
        Applique la configuration locale au modèle LLM.
        """
        # Appliquer le prompt système
        if hasattr(self.llm, "prompt_system"):
            self.llm.prompt_system = self.system_prompt
        
        # Appliquer les paramètres
        if hasattr(self.llm, "configurer"):
            params = {
                "temperature": self.temperature,
                "top_p": self.top_p,
                "max_tokens": self.max_tokens
            }
            
            # Ajustements selon le type de modèle
            if "mistral_medium" in self.llm.__class__.__name__.lower():
                params["temperature"] += 0.05
                params["max_tokens"] = 1000
            elif "pixtral" in self.llm.__class__.__name__.lower():
                params["temperature"] -= 0.05
            elif "ollama" in self.llm.__class__.__name__.lower():
                params["temperature"] += 0.1
                params.update({
                    "num_ctx": 2048,
                    "repeat_penalty": 1.1,
                })
            
            self.llm.configurer(**params)
    
    def executer(self, ticket_data: Dict) -> str:
        """
        Analyse un ticket JSON pour en extraire les informations pertinentes
        
        Args:
            ticket_data: Dictionnaire contenant les données du ticket à analyser
            
        Returns:
            Réponse formatée contenant l'analyse du ticket
        """
        logger.info(f"Analyse du ticket: {ticket_data.get('code', 'Inconnu')}")
        print(f"AgentJsonAnalyser: Analyse du ticket {ticket_data.get('code', 'Inconnu')}")
        
        # Préparer le ticket pour l'analyse
        ticket_formate = self._formater_ticket_pour_analyse(ticket_data)
        
        # Créer le prompt pour l'analyse
        prompt = f"""Analyse ce ticket de support technique et fournis une synthèse structurée:

{ticket_formate}

Réponds de manière factuelle, en te basant uniquement sur les informations fournies."""
        
        try:
            logger.info("Interrogation du LLM")
            response = self.llm.interroger(prompt)
            logger.info(f"Réponse reçue: {len(response)} caractères")
            print(f"  Analyse terminée: {len(response)} caractères")
        except Exception as e:
            error_message = f"Erreur lors de l'analyse du ticket: {str(e)}"
            logger.error(error_message)
            response = f"ERREUR: {error_message}"
            print(f"  ERREUR: {error_message}")
        
        # Enregistrer l'historique avec le prompt complet pour la traçabilité
        self.ajouter_historique("analyse_ticket", 
                               {
                                   "ticket_id": ticket_data.get("code", "Inconnu"),
                                   "prompt": prompt,
                                   "temperature": self.temperature,
                                   "top_p": self.top_p,
                                   "max_tokens": self.max_tokens,
                                   "timestamp": self._get_timestamp()
                               }, 
                               response)
        
        return response
    
    def _formater_ticket_pour_analyse(self, ticket_data: Dict) -> str:
        """
        Formate les données du ticket pour l'analyse LLM
        
        Args:
            ticket_data: Les données du ticket
            
        Returns:
            Représentation textuelle formatée du ticket
        """
        # Initialiser avec les informations de base
        info = f"## TICKET {ticket_data.get('code', 'Inconnu')}: {ticket_data.get('name', 'Sans titre')}\n\n"
        
        # Ajouter la description
        description = ticket_data.get('description', '')
        if description:
            info += f"## DESCRIPTION\n{description}\n\n"
        
        # Ajouter les informations du ticket
        info += "## INFORMATIONS DU TICKET\n"
        for key, value in ticket_data.items():
            if key not in ['code', 'name', 'description', 'messages', 'metadata'] and value:
                info += f"- {key}: {value}\n"
        info += "\n"
        
        # Ajouter les messages (conversations)
        messages = ticket_data.get('messages', [])
        if messages:
            info += "## ÉCHANGES ET MESSAGES\n"
            for i, msg in enumerate(messages):
                sender = msg.get('from', 'Inconnu')
                date = msg.get('date', 'Date inconnue')
                content = msg.get('content', '')
                info += f"### Message {i+1} - De: {sender} - Date: {date}\n{content}\n\n"
        
        # Ajouter les métadonnées techniques si présentes
        metadata = ticket_data.get('metadata', {})
        if metadata:
            info += "## MÉTADONNÉES TECHNIQUES\n"
            info += json.dumps(metadata, indent=2, ensure_ascii=False)
            info += "\n"
        
        return info
    
    def _get_timestamp(self) -> str:
        """Retourne un timestamp au format YYYYMMDD_HHMMSS"""
        from datetime import datetime
        return datetime.now().strftime("%Y%m%d_%H%M%S")