#!/usr/bin/env python3
"""Script de test complet du système avec OpenAI.

Ce script teste toute la chaîne :
1. Authentification
2. Création d'histoire
3. Initialisation (skeleton + cover) avec OpenAI
4. Démarrage de la narration (premier passage)
5. Action du joueur et génération de la suite
"""

import requests
import json
import time
from urllib3.exceptions import InsecureRequestWarning

# Désactiver les warnings SSL pour les tests locaux
requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)

API_URL = "https://story.cosmail.fr/api"

def print_section(title: str):
    """Affiche une section."""
    print("\n" + "="*60)
    print(f"  {title}")
    print("="*60)

def test_complete_flow():
    """Teste le flux complet avec OpenAI."""
    
    print_section("TEST COMPLET - Phase 2 : IA + Gameplay")
    
    # 1. Connexion
    print("\n1️⃣  Connexion...")
    response = requests.post(
        f"{API_URL}/auth/login",
        json={"email": "demo@story.fr", "password": "DemoPass123"},
        verify=False
    )
    
    if response.status_code != 200:
        print(f"❌ Échec connexion: {response.status_code}")
        return
    
    data = response.json()
    token = data["access_token"]
    print(f"✅ Connecté: {data['user']['username']}")
    
    # 2. Création d'histoire
    print("\n2️⃣  Création d'une histoire de test...")
    response = requests.post(
        f"{API_URL}/stories",
        headers={"Authorization": f"Bearer {token}"},
        json={
            "title": "La Quête du Dragon d'Émeraude",
            "genre": "fantasy épique",
            "epoch": "médiéval fantastique",
            "reality_level": 90,
            "narrative_perspective": "second",
            "game_mode": "choices"
        },
        verify=False
    )
    
    if response.status_code != 201:
        print(f"❌ Échec création: {response.status_code}")
        print(response.text)
        return
    
    story = response.json()["story"]
    story_id = story["id"]
    print(f"✅ Histoire créée: {story['title']}")
    print(f"   ID: {story_id}")
    print(f"   Genre: {story['genre']}, Époque: {story['epoch']}")
    
    # 3. Initialisation avec OpenAI (skeleton + cover)
    print("\n3️⃣  Initialisation de l'histoire avec OpenAI...")
    print("   ⏳ Génération du squelette narratif (GPT-4)...")
    print("   ⏳ Génération de la couverture (DALL-E 3)...")
    print("   (Cela peut prendre 20-30 secondes...)")
    
    start_time = time.time()
    response = requests.post(
        f"{API_URL}/gameplay/init-story",
        headers={"Authorization": f"Bearer {token}"},
        json={
            "story_id": story_id,
            "context_answers": {
                "protagoniste": "Un jeune chevalier novice nommé Aldric",
                "ambiance": "Épique et mystérieuse",
                "thème": "Le courage face à l'adversité"
            }
        },
        verify=False,
        timeout=60
    )
    
    elapsed = time.time() - start_time
    
    if response.status_code != 200:
        print(f"❌ Échec initialisation: {response.status_code}")
        print(response.text)
        return
    
    story = response.json()["story"]
    print(f"✅ Histoire initialisée en {elapsed:.1f}s")
    
    # Afficher le squelette
    skeleton = story["narrative_skeleton"]
    print("\n📖 SQUELETTE NARRATIF GÉNÉRÉ:")
    print(f"   Acte 1: {skeleton['act_1']['description']}")
    print(f"   Acte 2: {skeleton['act_2']['description']}")
    print(f"   Acte 3: {skeleton['act_3']['description']}")
    print(f"   Thèmes: {', '.join(skeleton['themes'])}")
    print(f"   Ton: {skeleton['tone']}")
    
    # Afficher l'URL de la couverture
    cover_url = story["cover_image_url"]
    print(f"\n🎨 COUVERTURE GÉNÉRÉE:")
    print(f"   URL: {cover_url[:80]}...")
    
    # 4. Démarrer l'histoire (premier passage)
    print("\n4️⃣  Démarrage de la narration...")
    print("   ⏳ Génération du premier passage (GPT-4)...")
    print("   (Cela peut prendre 10-15 secondes...)")
    
    start_time = time.time()
    response = requests.post(
        f"{API_URL}/gameplay/start-story/{story_id}",
        headers={"Authorization": f"Bearer {token}"},
        verify=False,
        timeout=60
    )
    
    elapsed = time.time() - start_time
    
    if response.status_code != 200:
        print(f"❌ Échec démarrage: {response.status_code}")
        print(response.text)
        return
    
    data = response.json()
    turn = data["turn"]
    print(f"✅ Histoire démarrée en {elapsed:.1f}s")
    
    # Afficher le premier passage
    print("\n📜 PREMIER PASSAGE NARRATIF:")
    print("-" * 60)
    print(turn["narrative_text"])
    print("-" * 60)
    
    # Afficher les choix
    if turn["available_choices"]:
        print("\n🎯 CHOIX DISPONIBLES:")
        for i, choice in enumerate(turn["available_choices"]):
            print(f"   {chr(65+i)}) {choice}")
    
    # 5. Envoyer une action du joueur
    print("\n5️⃣  Envoi d'une action du joueur...")
    action = turn["available_choices"][0] if turn["available_choices"] else "Observer attentivement les alentours"
    print(f"   Action choisie: {action}")
    print("   ⏳ Génération de la suite (GPT-4)...")
    print("   (Cela peut prendre 10-15 secondes...)")
    
    start_time = time.time()
    response = requests.post(
        f"{API_URL}/gameplay/action",
        headers={"Authorization": f"Bearer {token}"},
        json={
            "story_id": story_id,
            "action": action,
            "is_technical": False,
            "selected_choice_index": 0 if turn["available_choices"] else None
        },
        verify=False,
        timeout=60
    )
    
    elapsed = time.time() - start_time
    
    if response.status_code != 200:
        print(f"❌ Échec action: {response.status_code}")
        print(response.text)
        return
    
    data = response.json()
    new_turn = data["turn"]
    print(f"✅ Suite générée en {elapsed:.1f}s")
    
    # Afficher la suite
    print("\n📜 SUITE DE L'HISTOIRE:")
    print("-" * 60)
    print(new_turn["narrative_text"])
    print("-" * 60)
    
    # Afficher les nouveaux choix
    if new_turn["available_choices"]:
        print("\n🎯 NOUVEAUX CHOIX:")
        for i, choice in enumerate(new_turn["available_choices"]):
            print(f"   {chr(65+i)}) {choice}")
    
    # Récupérer le LoreBook
    print("\n6️⃣  Consultation du LoreBook...")
    response = requests.get(
        f"{API_URL}/stories/{story_id}",
        headers={"Authorization": f"Bearer {token}"},
        verify=False
    )
    
    if response.status_code == 200:
        story = response.json()["story"]
        print(f"✅ LoreBook mis à jour (version actuelle)")
        print(f"   Nombre de tours: {story['turn_count']}")
    
    # Récapitulatif
    print_section("RÉCAPITULATIF DU TEST")
    print("✅ Tous les tests ont réussi!")
    print("\nFonctionnalités testées:")
    print("  ✅ Authentification JWT")
    print("  ✅ Création d'histoire")
    print("  ✅ Génération squelette narratif (GPT-4)")
    print("  ✅ Génération couverture (DALL-E 3)")
    print("  ✅ Génération premier passage (GPT-4)")
    print("  ✅ Génération de choix (GPT-4)")
    print("  ✅ Action joueur + suite (GPT-4)")
    print("  ✅ Mise à jour LoreBook automatique (GPT-4)")
    print("\n🎉 Phase 2 terminée avec succès!")
    print("\n📝 Détails de l'histoire:")
    print(f"   ID: {story_id}")
    print(f"   Titre: La Quête du Dragon d'Émeraude")
    print(f"   URL Couverture: {cover_url}")

if __name__ == "__main__":
    try:
        test_complete_flow()
    except Exception as e:
        print(f"\n❌ ERREUR: {str(e)}")
        import traceback
        traceback.print_exc()

