import requests
import argparse
import urllib.parse
import readline

def lire_message_utilisateur():
    """Lit plusieurs lignes jusqu’à une ligne vide, puis retourne le message complet."""
    print("Vous (appuyez 2x Entrée pour envoyer) :")
    lignes = []
    prompt = ">>>"
    while True:
        try:
            ligne = input(prompt)
            prompt = "   "
            if ligne.strip() == "":
                break
            lignes.append(ligne)
        except EOFError:
            break
    return "\n".join(lignes)


def envoyer_requete_au_llm(url_serveur, nom_modele, cle_api, temperature, historique):
    """Envoie une requête POST au serveur LLM sur /v1/chat/completions."""
    url_api = urllib.parse.urljoin(url_serveur.rstrip("/") + "/", "v1/chat/completions")

    try:
        payload = {
            "model": nom_modele,
            "messages": historique,
            "temperature": temperature
        }
        headers = {
            "Authorization": f"Bearer {cle_api}",
            "Content-Type": "application/json"
        }

        response = requests.post(url_api, json=payload, headers=headers)
        response.raise_for_status()

        reponse = response.json().get("choices", [{}])[0].get("message", {}).get("content", "Réponse non disponible")
        return reponse

    except requests.exceptions.RequestException as e:
        return f"Erreur lors de la communication avec le LLM : {e}"

def demarrer_chatbot(url_serveur, nom_modele, cle_api, temperature, preprompt, avec_memoire):
    """Boucle principale du chatbot."""
    print("Chatbot lancé. Tapez 'exit' pour quitter.\n")

    historique = [{"role": "system", "content": preprompt}] if avec_memoire or preprompt else []

    while True:
        message_utilisateur = lire_message_utilisateur()
        if message_utilisateur.strip().lower() == "exit":
            print("Au revoir !")
            break

        if avec_memoire:
            historique.append({"role": "user", "content": message_utilisateur})
            reponse = envoyer_requete_au_llm(url_serveur, nom_modele, cle_api, temperature, historique)
            historique.append({"role": "assistant", "content": reponse})
        else:
            messages = []
            if preprompt:
                messages.append({"role": "system", "content": preprompt})
            messages.append({"role": "user", "content": message_utilisateur})
            reponse = envoyer_requete_au_llm(url_serveur, nom_modele, cle_api, temperature, messages)

        print(f"Chatbot: {reponse}\n")

def recuperer_arguments():
    """Récupère les arguments nécessaires à l'exécution du chatbot."""
    parser = argparse.ArgumentParser(description="Chatbot CLI avec mémoire optionnelle et paramètres flexibles.")

    parser.add_argument("url_serveur", type=str, help="URL de base du serveur LLM (ex: https://api.llm.com)")
    parser.add_argument("nom_modele", type=str, help="Nom du modèle (ex: gpt-4)")
    parser.add_argument("cle_api", type=str, help="Clé API")

    # Paramètres optionnels
    parser.add_argument("--temperature", type=float, default=0.0, help="Température du modèle (par défaut: 0.0)")
    parser.add_argument("--preprompt", type=str, default="", help="Pré-prompt système (par défaut: chaîne vide)")
    parser.add_argument("--avec_memoire", action="store_true", help="Activer la mémoire entre les messages")

    return parser.parse_args()

def main():
    args = recuperer_arguments()
    demarrer_chatbot(
        url_serveur=args.url_serveur,
        nom_modele=args.nom_modele,
        cle_api=args.cle_api,
        temperature=args.temperature,
        preprompt=args.preprompt,
        avec_memoire=args.avec_memoire
    )

if __name__ == "__main__":
    main()
