import requests
import os
from datetime import datetime
import uuid #pour générer un identifiant unique
from itertools import product #pour générer toutes les combinaisons de paramètres

#=== Configuration ===
model_name = "mistral:latest"
prompt = "Explique-moi ce qu'et l'intelligence artificielle."

#Paramètres par défaut
base_params = {
    "model": model_name,
    "prompt": prompt,
    "temperature": 0.5,        # Créativité (0.1 = précis, 1.5 = créatif)
    "top_p": 0.9,              # Probabilité cumulée (1.0 = complet)
    "top_k": 50,               # Top-k tokens à considérer (0 = désactivé)
    "repeat_penalty": 1.1,     # Pénalise les répétitions (>1 = punit)
    "num_predict": 512,        # Max tokens générés
    "stop": [],                # Liste de tokens d'arrêt (optionnel)
    "seed": None,               # Pour reproduction des résultats
    "stream": False
}

#Paramètres à faire varier
parameters_to_test = {
    "temperature": [0.1, 0.5, 1.0],
    #"top_p": [0.5, 0.9, 1.0],
    #"top_k": [10, 50, 100],
    #"repeat_penalty": [1.0, 1.1, 1.2],
}
#Préparation des combinaisons
varying_keys = list(parameters_to_test.keys())
combinations = list(product(*[parameters_to_test[k] for k in varying_keys]))

#Création des dossiers de logs
os.makedirs("logs", exist_ok=True)
index_path = "log_index.md"

# Boucle de test
for combo in combinations:
    test_params = base_params.copy()
    combo_desc = []
    
    for i, key in enumerate(varying_keys):
        test_params[key] = combo[i]
        combo_desc.append(f"{key}={combo[i]}")
    
    #Requête à ollama
    response = requests.post("http://217.182.105.173:11434/api/generate", json=test_params)
    result = response.json()["response"] if response.ok else f"Erreur: {response.text}"

    #enregistrement des résultats
    now = datetime.now()
    now_str = now.strftime("%Y-%m-%d_%H-%M-%S")
    uid = str(uuid.uuid4())[:8] #générer un identifiant unique
    log_name = f"mistral_{now_str}_{uid}.md" #nom du fichier de log
    # === Fichier principal .md (réponse) ===
    log_path = os.path.join("logs", log_name)

     # Sauvegarde Markdown
    with open(log_path, "w", encoding="utf-8") as f:
        f.write(f"# Résultat génération Mistral\n\n")
        f.write(f"** Test ID :** {uid}\n")
        f.write(f"** Date :** {now.strftime('%Y-%m-%d %H:%M:%S')}\n")
        f.write(f"** Modèle :** {model_name}\n")
        f.write(f"** Prompt :** {prompt}\n")
        f.write(f"** Combinaison :** {', '.join(combo_desc)}\n\n")
        f.write("---\n\n## Paramètres complets\n\n")
        for key in test_params:
            if key not in ["model", "prompt"]:
                val = test_params[key]
                val = " / ".join(val) if isinstance(val, list) else val or "*Aucun*"
                f.write(f"- {key.replace('_', ' ').title()} : {val}\n")
        f.write("\n---\n\n## Réponse du modèle\n\n")
        f.write(result.strip() + "\n")

    # Mise à jour de l’index
    with open(index_path, "a", encoding="utf-8") as idx:
        idx.write(f"- **{now.strftime('%Y-%m-%d %H:%M:%S')}** | `{uid}` | ")
        idx.write(f"`{model_name}` | {' | '.join(combo_desc)} | [Voir le log](logs/{log_name})\n")