import requests
from utils.token_management import add_tokens_used
import json

def call_mistral_api(user, agent_id=None, max_tokens=1024, messages=None, language=None, content=None, images=None, response_format=None):
    """
    Fonction utilitaire pour faire des appels à l'API Mistral et gérer le comptage des tokens.
    
    Args:
        user: L'utilisateur qui fait la requête
        agent_id (optional): L'ID de l'agent Mistral à utiliser
        max_tokens (optional): Nombre maximum de tokens pour la réponse
        messages (optional): Messages au format de la documentation Mistral
        content (optional): Texte qui sera ajouté à la requête dans un message "user". Si utilisé conjointement à "messages", apparaitra en premier.
        images (optional): Liste d'images supplémentaires à inclure dans la requête
        response_format (optional): Format de réponse souhaité (e.g., {"type": "json_object"})
    
    Returns:
        tuple: (contenu de la réponse, None) en cas de succès, (None, erreur) en cas d'échec
    """

    api_key = "H20rSMbOuAzRkkuUTUS64tfTjyzfPDRb"
    url = "https://api.mistral.ai/v1/agents/completions"
    headers = {
        'Authorization': f'Bearer {api_key}',
        'Content-Type': 'application/json',
        'Accept': 'application/json',
    }

    # Construction des messages
    final_messages = []
    
    # Ajout du message principal
    if content:
        final_messages.append({
            "role": "user",
            "content": content
        })
    
    if language:
        final_messages.append({
            "role": "user",
            "content": "Génère un texte en " + language
        })

    # Ajout des messages additionnels
    if messages:
        final_messages.extend(messages)

    # Ajout des images si présentes
    if images:
        for image in images:
            final_messages.append({
                "role": "user",
                "content": {
                    "type": "image_url",
                    "image_url": image
                }
            })

    # Construction du body de la requête
    body = {
        "messages": final_messages,
        "max_tokens": max_tokens,
        "stream": False,
        "safe_prompt": False,
    }

    if agent_id:
        body["agent_id"] = agent_id
    
    if response_format:
        body["response_format"] = response_format

    try:
        response = requests.post(url, headers=headers, json=body)
        if response.status_code == 200:
            response_data = response.json()
            content = response_data['choices'][0]['message']['content']
            # Comptage des tokens
            tokens_used = response_data['usage']['total_tokens']
            add_tokens_used(user, tokens_used)
            
            return content, None
        else:
            return None, {"error": f"API error: {response.status_code}", "response": response.json()}
    except Exception as e:
        return None, {"error": str(e)}