"""
Test de l'intégration des modules OWASP avec l'orchestrateur
"""

import sys
from pathlib import Path

# Ajouter le répertoire racine au path
project_root = Path(__file__).parent.parent
sys.path.insert(0, str(project_root))

from web_sentinel.orchestrator import build_default_modules


def test_owasp_modules_integration():
    """Test que les nouveaux modules OWASP sont bien intégrés dans l'orchestrateur."""
    
    print("🔍 Test d'intégration des modules OWASP avec l'orchestrateur...")
    
    # Charger tous les modules par défaut
    modules = build_default_modules()
    module_names = [module.name for module in modules]
    
    print(f"📊 Modules chargés: {len(modules)}")
    print("📝 Liste des modules:")
    for module in modules:
        print(f"   • {module.name:<25} - {module.description}")
    
    # Vérifier que nos nouveaux modules OWASP sont présents
    expected_owasp_modules = [
        "access-control",
        "crypto-failures", 
        "vulnerable-components",
        "insecure-design",
        "security-misconfiguration",
        "broken-authentication"
    ]
    
    print("\n🔐 Vérification des modules OWASP Top 10 2021:")
    
    missing_modules = []
    for expected_module in expected_owasp_modules:
        if expected_module in module_names:
            print(f"   ✅ {expected_module}")
        else:
            print(f"   ❌ {expected_module} - MANQUANT")
            missing_modules.append(expected_module)
    
    if missing_modules:
        print(f"\n❌ Modules manquants: {missing_modules}")
        return False
    else:
        print(f"\n✅ Tous les modules OWASP Top 10 2021 sont intégrés !")
        
        # Test que les runners sont bien callable
        print("\n🧪 Test des fonctions runner:")
        for module in modules:
            if module.name in expected_owasp_modules:
                if callable(module.runner):
                    print(f"   ✅ {module.name} - Runner callable")
                else:
                    print(f"   ❌ {module.name} - Runner non callable")
                    return False
        
        return True


def test_module_execution():
    """Test de l'exécution basique des modules."""
    
    print("\n🚀 Test d'exécution basique des modules OWASP...")
    
    from web_sentinel.model import ScanRequest
    
    # Créer une requête de test
    request = ScanRequest(domain="example.com")
    
    modules = build_default_modules()
    owasp_modules = [m for m in modules if any(tag.startswith("owasp-") for tag in m.tags)]
    
    print(f"🎯 Modules OWASP à tester: {len(owasp_modules)}")
    
    all_success = True
    for module in owasp_modules:
        try:
            print(f"   🧪 Test {module.name}...", end="")
            findings = list(module.runner(request))
            
            if isinstance(findings, list):
                print(f" ✅ OK ({len(findings)} findings)")
            else:
                print(f" ❌ Erreur: retourne {type(findings)} au lieu de list")
                all_success = False
                
        except Exception as e:
            print(f" ❌ Exception: {e}")
            all_success = False
    
    return all_success


if __name__ == "__main__":
    
    print("=" * 80)
    print("🔐 WEB SENTINEL - TEST D'INTÉGRATION MODULES OWASP")
    print("=" * 80)
    
    # Test 1: Intégration dans l'orchestrateur
    integration_success = test_owasp_modules_integration()
    
    # Test 2: Exécution basique
    execution_success = test_module_execution()
    
    print("\n" + "=" * 80)
    print("📋 RÉSUMÉ DES TESTS")
    print("=" * 80)
    
    if integration_success:
        print("✅ Intégration orchestrateur: RÉUSSIE")
    else:
        print("❌ Intégration orchestrateur: ÉCHEC")
    
    if execution_success:
        print("✅ Exécution basique: RÉUSSIE")
    else:
        print("❌ Exécution basique: ÉCHEC")
    
    if integration_success and execution_success:
        print("\n🎉 TOUS LES TESTS D'INTÉGRATION ONT RÉUSSI !")
        print("🔐 Les modules OWASP Top 10 2021 sont correctement intégrés dans Web Sentinel")
        exit(0)
    else:
        print("\n❌ CERTAINS TESTS ONT ÉCHOUÉ")
        print("🔧 Vérifiez les erreurs ci-dessus")
        exit(1)