"""
Script de test pour l'intégration Stripe
Teste tous les endpoints de l'API de paiement
"""

import requests
import json
from typing import Dict, Any

API_BASE = "http://localhost:5000/api/v1/payment"

def print_response(title: str, response: requests.Response):
    """Affiche joliment une réponse API"""
    print(f"\n{'='*60}")
    print(f"📍 {title}")
    print(f"{'='*60}")
    print(f"Status Code: {response.status_code}")
    try:
        data = response.json()
        print(json.dumps(data, indent=2, ensure_ascii=False))
    except:
        print(response.text)

def test_config():
    """Test 1: Récupérer la configuration"""
    print("\n🧪 TEST 1: Récupération de la configuration Stripe")
    response = requests.get(f"{API_BASE}/config")
    print_response("GET /config", response)
    return response.json() if response.status_code == 200 else None

def test_create_checkout_session(lookup_key: str, email: str):
    """Test 2: Créer une session Checkout"""
    print(f"\n🧪 TEST 2: Création d'une session Checkout pour {lookup_key}")
    
    payload = {
        "lookup_key": lookup_key,
        "customer_email": email,
        "success_url": "http://localhost:8000/payment/success.html",
        "cancel_url": "http://localhost:8000/payment/cancel.html",
        "metadata": {
            "test": "true",
            "source": "test_script"
        }
    }
    
    response = requests.post(
        f"{API_BASE}/create-checkout-session",
        json=payload,
        headers={"Content-Type": "application/json"}
    )
    
    print_response("POST /create-checkout-session", response)
    
    if response.status_code == 200:
        data = response.json()
        if data.get('success'):
            print(f"\n✅ Session créée avec succès!")
            print(f"🔗 URL de paiement: {data['data']['url']}")
            return data['data']
    
    return None

def test_get_session(session_id: str):
    """Test 3: Récupérer les détails d'une session"""
    print(f"\n🧪 TEST 3: Récupération des détails de la session {session_id}")
    
    response = requests.get(f"{API_BASE}/session/{session_id}")
    print_response(f"GET /session/{session_id}", response)
    
    return response.json() if response.status_code == 200 else None

def test_create_portal_session(customer_id: str):
    """Test 4: Créer une session de portail client"""
    print(f"\n🧪 TEST 4: Création d'une session de portail pour {customer_id}")
    
    payload = {
        "customer_id": customer_id,
        "return_url": "http://localhost:8000/account"
    }
    
    response = requests.post(
        f"{API_BASE}/create-portal-session",
        json=payload,
        headers={"Content-Type": "application/json"}
    )
    
    print_response("POST /create-portal-session", response)
    
    if response.status_code == 200:
        data = response.json()
        if data.get('success'):
            print(f"\n✅ Session portail créée avec succès!")
            print(f"🔗 URL du portail: {data['data']['url']}")
            return data['data']
    
    return None

def run_all_tests():
    """Exécute tous les tests"""
    print("""
    ╔═══════════════════════════════════════════════════════════╗
    ║        🧪 Tests de l'API de Paiement Stripe              ║
    ║                   Web Sentinel                            ║
    ╚═══════════════════════════════════════════════════════════╝
    """)
    
    # Vérifier que l'API est accessible
    try:
        response = requests.get(f"{API_BASE}/config", timeout=5)
    except requests.exceptions.ConnectionError:
        print("❌ Erreur: L'API n'est pas accessible sur http://localhost:5000")
        print("👉 Assurez-vous que l'API est démarrée avec: python web_sentinel_api_full.py")
        return
    
    # Test 1: Configuration
    config = test_config()
    if not config:
        print("\n❌ La configuration Stripe n'est pas disponible")
        print("👉 Vérifiez que STRIPE_SECRET_KEY et STRIPE_PUBLISHABLE_KEY sont définis")
        return
    
    if not config.get('data', {}).get('configured'):
        print("\n⚠️ Stripe n'est pas encore configuré")
        print("👉 Suivez le guide: docs/stripe/STRIPE_SETUP_GUIDE.md")
        return
    
    print("\n✅ Stripe est configuré correctement!")
    
    # Test 2: Création de session Checkout pour PRO mensuel
    print("\n" + "─" * 60)
    session_data = test_create_checkout_session(
        lookup_key="web_sentinel_pro_monthly",
        email="test@example.com"
    )
    
    if session_data:
        print(f"\n💡 Vous pouvez tester le paiement en ouvrant cette URL dans votre navigateur:")
        print(f"   {session_data['url']}")
        print(f"\n💳 Utilisez la carte de test: 4242 4242 4242 4242")
    
    # Test 3: Test avec un autre plan
    print("\n" + "─" * 60)
    session_data_2 = test_create_checkout_session(
        lookup_key="web_sentinel_enterprise_yearly",
        email="enterprise@example.com"
    )
    
    # Résumé final
    print(f"\n{'='*60}")
    print("📊 RÉSUMÉ DES TESTS")
    print(f"{'='*60}")
    print("✅ Configuration Stripe: OK")
    print(f"✅ Création de session Checkout: {'OK' if session_data else 'ÉCHEC'}")
    print(f"✅ Plans configurés: {len(config.get('data', {}).get('plans', {}))}")
    
    print("\n" + "─" * 60)
    print("📝 NOTES:")
    print("   • Pour tester le webhook, utilisez Stripe CLI:")
    print("     stripe listen --forward-to localhost:5000/api/v1/payment/webhook")
    print("   • Pour tester un paiement complet, ouvrez l'URL de session ci-dessus")
    print("   • Les cartes de test sont disponibles sur: https://stripe.com/docs/testing")
    print("─" * 60)

if __name__ == "__main__":
    run_all_tests()
