import json
from typing import Dict, List, Any, Optional, Union
from .llm import LLM

class DeepSeek(LLM):
    """
    Classe pour l'intégration avec l'API DeepSeek
    Cette classe hérite de la classe de base LLM
    """
    
    def __init__(self):
        """
        Initialisation des attributs spécifiques à DeepSeek
        """
        super().__init__()
        
        # Attributs spécifiques à DeepSeek
        self.frequency_penalty: int = 0
        self.max_tokens: int = 4096
        self.presence_penalty: int = 0
        self.logprobs: bool = False
        self.top_logprobs: int = 0
        self.tool_choice: str = ""
        
        # Initialisation par défaut
        self.Modele = "deepseek-chat"
        self.frequency_penalty = 0
        self.max_tokens = 4096
        self.presence_penalty = 0
        self.o_top_p = 1
        self.logprobs = False
        self.top_logprobs = 0
        self.tool_choice = ""
    
    def urlBase(self) -> str:
        """
        Retourne l'URL de base de l'API DeepSeek
        """
        return "https://api.deepseek.com/"
    
    def cleAPI(self) -> str:
        """
        Retourne la clé API DeepSeek
        """
        return "sk-d359d9236ca84a5986f889631832d1e6"
    
    def urlFonction(self) -> str:
        """
        Retourne l'URL de la fonction par défaut pour DeepSeek
        """
        return "chat/completions"
    
    def model_list(self) -> List[str]:
        """
        Retourne la liste des modèles disponibles pour DeepSeek
        """
        return ["deepseek-chat", "deepseek-reasoner"]
    
    def _even_LLM_POST(self, question: str) -> None:
        """
        Préparation du contenu de la requête pour DeepSeek
        """
        self._Contenu["messages"] = [
            {"role": "system", "content": self.prompt_system},
            {"role": "user", "content": question}
        ]
        
        self._Contenu["stream"] = self._stream
        self._Contenu["frequency_penalty"] = self.frequency_penalty
        self._Contenu["max_tokens"] = self.max_tokens
        self._Contenu["presence_penalty"] = self.presence_penalty
        
        # Ajout des logprobs si activés
        if self.logprobs:
            self._Contenu["logprobs"] = self.logprobs
            self._Contenu["top_logprobs"] = self.top_logprobs
        
        # Ajout du tool_choice si défini
        if self.tool_choice:
            self._Contenu["tool_choice"] = self.tool_choice
    
    def _interrogerRetourneReponse(self, reponse: str) -> str:
        """
        Extraction de la réponse à partir du JSON retourné par DeepSeek
        """
        data = json.loads(reponse)
        return data["choices"][0]["message"]["content"] 