#!/usr/bin/env python3
"""
✅ Test Final de Connexion - Web Sentinel

Test complet pour vérifier que la connexion fonctionne avec nos données modifiées.
"""

import os
import sys
import time
from pathlib import Path

# Définir les variables d'environnement AVANT les imports
os.environ['WS_TEST_MODE'] = '1'
os.environ['WEB_SENTINEL_AUTH_URL'] = 'http://localhost:8765'

# Ajouter les chemins
sys.path.insert(0, str(Path(__file__).parent))
sys.path.insert(0, str(Path(__file__).parent.parent))

from local_subscription_api import LocalSubscriptionAPI
from real_db_connector import RealDatabaseConnector


def test_login_with_modified_data():
    """Tester la connexion avec les données modifiées."""
    print("✅ TEST FINAL DE CONNEXION WEB SENTINEL")
    print("=" * 50)
    
    # 1. Démarrer l'API locale
    print("\n1. 🌐 Démarrage API locale...")
    api = LocalSubscriptionAPI()
    api.start()
    time.sleep(1)
    
    if not api.is_running():
        print("❌ Impossible de démarrer l'API locale")
        return False
    
    print(f"✅ API locale démarrée: {api.get_url()}")
    
    try:
        # 2. Vérifier les données utilisateur
        print("\n2. 🔍 Vérification données utilisateur...")
        db_connector = RealDatabaseConnector()
        user_info = db_connector.get_user_info('bruno@taaazzz-prog.fr')
        
        if not user_info:
            print("❌ Utilisateur bruno@taaazzz-prog.fr non trouvé")
            return False
        
        print(f"✅ Utilisateur trouvé: {user_info['email']}")
        print(f"✅ ID: {user_info['id']}")
        print(f"✅ Tier: {user_info['subscription_tier']}")
        
        # 3. Tester l'AuthManager
        print("\n3. 🔐 Test AuthManager...")
        from web_sentinel.auth.auth_manager import AuthManager
        from web_sentinel.auth.models import User, AuthProvider
        
        auth_manager = AuthManager()
        print(f"✅ AuthManager initialisé")
        print(f"📡 URL API: {auth_manager.cloud_api_url}")
        print(f"🔀 Mode offline: {auth_manager.offline_mode}")
        
        # 4. Simuler une session utilisateur connecté
        print("\n4. 👤 Simulation session utilisateur...")
        
        # Récupérer l'utilisateur depuis la base locale
        user_data = user_info['user_data']
        user = User(**user_data)
        
        # Créer une session fictive (normalement fait par login)
        from web_sentinel.auth.models import UserSession, AccessToken
        from datetime import datetime, timezone, timedelta
        
        # Créer un token fictif
        access_token = AccessToken(
            token="test-token-123",
            expires_at=datetime.now(timezone.utc) + timedelta(hours=1)
        )
        
        # Créer la session
        session = UserSession(
            session_id="test-session-123",
            user=user,
            access_token=access_token,
            created_at=datetime.now(timezone.utc),
            last_activity=datetime.now(timezone.utc)
        )
        
        # Assigner la session à l'AuthManager
        auth_manager.current_session = session
        
        print(f"✅ Session créée pour: {user.email}")
        print(f"✅ Utilisateur authentifié: {auth_manager.is_authenticated()}")
        
        # 5. Tester la récupération du tier
        print("\n5. 🎫 Test récupération tier...")
        
        subscription_manager = auth_manager.get_subscription_manager()
        
        print(f"✅ SubscriptionManager obtenu")
        print(f"🎫 Tier: {subscription_manager.tier.value}")
        print(f"📊 Tests invasifs: {subscription_manager.can_use_invasive_tests()}")
        print(f"📊 Export HTML: {subscription_manager.can_export_html()}")
        print(f"📊 API: {subscription_manager.can_use_api()}")
        print(f"📊 Limite domaines: {subscription_manager.get_domain_limit()}")
        
        # 6. Vérifier que le tier correspond à nos données
        expected_tier = user_info['subscription_tier']
        actual_tier = subscription_manager.tier.value
        
        if expected_tier == actual_tier:
            print(f"\n🎉 SUCCÈS COMPLET !")
            print(f"✅ Le tier {actual_tier.upper()} est correctement récupéré depuis notre base")
            print(f"✅ L'AuthManager utilise notre API locale")
            print(f"✅ Les permissions correspondent au tier")
            return True
        else:
            print(f"\n❌ INCOHÉRENCE TIER")
            print(f"   Attendu (base): {expected_tier}")
            print(f"   Obtenu (manager): {actual_tier}")
            return False
        
    except Exception as e:
        print(f"❌ Erreur: {e}")
        import traceback
        traceback.print_exc()
        return False
    
    finally:
        api.stop()


def test_login_flow():
    """Tester le flux de connexion complet."""
    print("\n🔐 TEST FLUX DE CONNEXION COMPLET")
    print("=" * 40)
    
    # Démarrer l'API locale
    api = LocalSubscriptionAPI()
    api.start()
    time.sleep(1)
    
    try:
        from web_sentinel.auth.auth_manager import AuthManager
        
        auth_manager = AuthManager()
        
        # Tenter de se connecter avec les vraies données
        email = "bruno@taaazzz-prog.fr"
        password = "test123"  # Mot de passe défini lors de la création
        
        print(f"🔐 Tentative de connexion: {email}")
        
        # Note: La méthode login nécessite une vraie API pour fonctionner
        # Pour ce test, on simule juste la session comme fait précédemment
        
        print(f"💡 Pour un test complet, utilisez la GUI ou CLI avec l'API locale")
        
    finally:
        api.stop()


if __name__ == "__main__":
    success = test_login_with_modified_data()
    print(f"\n{'🎉 SUCCÈS GLOBAL' if success else '❌ ÉCHEC'}")
    
    if success:
        print(f"\n💡 PROCHAINES ÉTAPES:")
        print(f"1. Lancer l'API locale: python local_subscription_api.py")
        print(f"2. Configurer les variables d'environnement:")
        print(f"   set WS_TEST_MODE=1")
        print(f"   set WEB_SENTINEL_AUTH_URL=http://localhost:8765")
        print(f"3. Lancer Web Sentinel GUI ou CLI")
        print(f"4. Se connecter avec bruno@taaazzz-prog.fr / test123")