from typing import List
from ..interface.base_response_generator import BaseResponseGenerator
import requests
import json

SYSTEM_PROMPT = """Tu es un assistant intelligent qui répond aux questions en te basant sur le contexte fourni.

Règles importantes:
- Réponds UNIQUEMENT en te basant sur les informations du contexte
- Si l'information n'est pas dans le contexte, dis clairement "Je ne trouve pas cette information dans les documents fournis"
- Cite les sources quand c'est pertinent
- Réponds en français de manière claire et concise
- Ne réponds pas avec "Selon le document" mais donne directement l'information"""


class ResponseGenerator(BaseResponseGenerator):
    
    def __init__(self, model_name: str = "llama3.2:3b", base_url: str = "http://localhost:11434"):
        self.model_name = model_name
        self.base_url = base_url
        
    def generate_response(self, query: str, context: List[str]) -> str:
        """Génère une réponse basée sur la requête et le contexte."""
        
        # Formater le contexte
        formatted_context = "\n\n".join([f"Document {i+1}:\n{doc}" for i, doc in enumerate(context)])
        
        # Créer le prompt
        prompt =f"""Instructions: {SYSTEM_PROMPT}
        
                    Contexte: {formatted_context}

                    Question: {query}

                    Réponse:"""

        # Appeler Ollama via l'API
        try:
            response = requests.post(
                f"{self.base_url}/api/generate",
                json={
                    "model": self.model_name,
                    "prompt": prompt,
                    "stream": False,
                    "options": {
                        "temperature": 0.7,
                        "top_p": 0.9,
                    }
                }
            )
        
            # Vérifier le statut de la réponse
            response.raise_for_status()
            
            # Parser le JSON
            result = response.json()
            
            # DEBUG: Afficher la structure de la réponse
            print(f"DEBUG - Structure de la réponse: {result.keys()}")
            
            # Vérifier les différentes clés possibles
            if "response" in result:
                return result["response"]
            elif "message" in result:
                return result["message"]
            elif "content" in result:
                return result["content"]
            else:
                # Si aucune clé attendue n'est trouvée
                print(f"DEBUG - Réponse complète: {result}")
                return f"Erreur: Format de réponse inattendu. Clés disponibles: {list(result.keys())}"
            
        except requests.exceptions.ConnectionError:
            return "❌ Impossible de se connecter au serveur Ollama. Vérifiez qu'Ollama est en cours d'exécution avec: ollama serve"
    
        except requests.exceptions.Timeout:
            return "⚠️ La génération a pris trop de temps. Essayez avec un modèle plus petit."
        
        except requests.exceptions.HTTPError as e:
            return f"❌ Erreur HTTP {response.status_code}: {e}"
        
        except Exception as e:
            return f"❌ Erreur lors de la génération: {str(e)}"