import os
import json
from typing import Dict, List, Any, Optional
from datetime import datetime

from agents.base_agent import Agent
from core.factory import LLMFactory

class AgentAnalyseImage(Agent):
    """
    Agent pour analyser des images avec LlamaVision
    """
    def __init__(self, nom: str = "AgentAnalyseImage"):
        """
        Initialisation de l'agent d'analyse d'image
        
        Args:
            nom: Nom de l'agent
        """
        super().__init__(nom)
        self.llm = LLMFactory.create("llamavision")
        self.questions_standard = [
            "Décris en détail ce que tu vois sur cette image.",
            "Quels sont les éléments principaux visibles sur cette image?",
            "Y a-t-il du texte visible sur cette image? Si oui, peux-tu le transcrire?",
            "Quelle est l'ambiance générale de cette image?"
        ]
    
    def executer(self, image_path: str, json_data: Optional[Dict[str, Any]] = None, 
                question: Optional[str] = None) -> Dict[str, Any]:
        """
        Analyse une image avec Llama Vision
        
        Args:
            image_path: Chemin vers l'image à analyser
            json_data: Données JSON optionnelles associées à l'image
            question: Question à poser au modèle (si None, utilise les questions standard)
            
        Returns:
            Résultats de l'analyse sous forme de dictionnaire
        """
        # Vérification de l'existence de l'image
        if not os.path.exists(image_path):
            resultat = {"erreur": f"L'image {image_path} n'existe pas"}
            self.ajouter_historique("analyse_image_erreur", image_path, resultat)
            return resultat
        
        # Chargement de l'image
        with open(image_path, "rb") as image_file:
            image_data = image_file.read()
        
        # Préparation de la liste des questions à poser
        questions_a_poser = [question] if question else self.questions_standard
        
        # Exécution de l'analyse pour chaque question
        resultats = {
            "image": image_path,
            "timestamp": datetime.now().isoformat(),
            "analyses": []
        }
        
        # Traitement pour chaque question
        for q in questions_a_poser:
            try:
                # Ajout des données JSON si fournies
                if json_data:
                    q_enrichie = f"{q}\n\nContexte: {json.dumps(json_data, ensure_ascii=False)}"
                else:
                    q_enrichie = q
                
                # Appel du modèle via la factory
                reponse = self.llm.generate(q_enrichie, images=[image_data])
                
                # Ajout du résultat
                resultats["analyses"].append({
                    "question": q,
                    "reponse": reponse
                })
                
                # Ajout à l'historique
                self.ajouter_historique("analyse_image", q, reponse[:200] + "...")
            except Exception as e:
                resultats["analyses"].append({
                    "question": q,
                    "erreur": str(e)
                })
                self.ajouter_historique("analyse_image_erreur", q, str(e))
        
        return resultats
    
    def sauvegarder_resultats(self, chemin_fichier: str, resultats: Dict[str, Any]) -> bool:
        """
        Sauvegarde les résultats d'analyse dans un fichier JSON
        
        Args:
            chemin_fichier: Chemin où sauvegarder le fichier de résultats
            resultats: Dictionnaire de résultats à sauvegarder
            
        Returns:
            True si la sauvegarde a réussi, False sinon
        """
        try:
            # Création du dossier parent si nécessaire
            os.makedirs(os.path.dirname(os.path.abspath(chemin_fichier)), exist_ok=True)
            
            with open(chemin_fichier, 'w', encoding='utf-8') as f:
                json.dump(resultats, f, ensure_ascii=False, indent=2)
            
            self.ajouter_historique("sauvegarder_resultats", chemin_fichier, "Résultats sauvegardés")
            return True
        except Exception as e:
            self.ajouter_historique("sauvegarder_resultats_erreur", chemin_fichier, str(e))
            return False 