#!/usr/bin/env python3
"""
Validation post-nettoyage du projet Web Sentinel
S'assurer que tout fonctionne après l'organisation
"""

import sys
import os
from pathlib import Path
import subprocess
import importlib

def test_core_imports():
    """Tester les imports principaux du projet."""
    print("🔍 Test des imports principaux...")
    
    core_modules = [
        "web_sentinel.cli",
        "web_sentinel.model",
        "web_sentinel.scanner", 
        "web_sentinel.orchestrator",
        "web_sentinel.reporting",
        "web_sentinel.gui.app",
        "web_sentinel.gui.modern_tabbed_window",
        "web_sentinel.auth",
        "web_sentinel.subscription",
        "web_sentinel.license.runtime_bridge",
        "web_sentinel.checks.headers",
        "web_sentinel.checks.tls",
        "web_sentinel.checks.source_code.scanner"
    ]
    
    success = True
    for module in core_modules:
        try:
            importlib.import_module(module)
            print(f"  ✅ {module}")
        except Exception as e:
            print(f"  ❌ {module}: {e}")
            success = False
    
    return success

def test_gui_functionality():
    """Tester la fonctionnalité de l'interface graphique."""
    print("\n🖥️ Test de l'interface graphique...")
    
    try:
        from web_sentinel.gui.modern_tabbed_window import ModernWebSentinelGUI
        import tkinter as tk
        
        # Test d'instanciation
        root = tk.Tk()
        root.withdraw()
        
        app = ModernWebSentinelGUI()
        
        # Test des méthodes critiques
        methods_to_test = [
            '_can_use_sast',
            'add_domain_to_list', 
            'browse_folder',
            'start_domain_scan',
            'export_json',
            'load_config'
        ]
        
        for method in methods_to_test:
            if hasattr(app, method):
                print(f"  ✅ Méthode disponible: {method}")
            else:
                print(f"  ❌ Méthode manquante: {method}")
                return False
        
        # Test de la structure des onglets
        if hasattr(app, 'notebook'):
            tab_count = app.notebook.index("end")
            print(f"  ✅ Onglets créés: {tab_count}")
        else:
            print("  ❌ Notebook manquant")
            return False
        
        app.root.quit()
        app.root.destroy()
        root.destroy()
        
        return True
        
    except Exception as e:
        print(f"  ❌ Erreur GUI: {e}")
        return False

def test_scripts_utilities():
    """Tester la disponibilité des scripts utilitaires."""
    print("\n🛠️ Test des scripts utilitaires...")
    
    scripts_dir = Path("scripts_utilitaires")
    if not scripts_dir.exists():
        print("  ❌ Dossier scripts_utilitaires manquant")
        return False
    
    essential_scripts = [
        "build_exe.py",
        "install.py", 
        "run_tests.py",
        "validate_deployment.py"
    ]
    
    success = True
    for script in essential_scripts:
        script_path = scripts_dir / script
        if script_path.exists():
            print(f"  ✅ {script}")
        else:
            print(f"  ❌ {script} manquant")
            success = False
    
    return success

def test_cli_functionality():
    """Tester la fonctionnalité CLI."""
    print("\n⌨️ Test du CLI...")
    
    try:
        from web_sentinel.cli import main as cli_main
        print("  ✅ CLI importable")
        
        # Test avec --help (ne pas lancer de scan réel)
        result = subprocess.run([
            sys.executable, "-m", "web_sentinel.cli", "--help"
        ], capture_output=True, text=True, timeout=10)
        
        if result.returncode == 0:
            print("  ✅ CLI --help fonctionne")
        else:
            print(f"  ⚠️ CLI --help: code {result.returncode}")
        
        return True
        
    except Exception as e:
        print(f"  ❌ Erreur CLI: {e}")
        return False

def test_compilation():
    """Tester que la compilation est possible."""
    print("\n🔨 Test de la compilation...")
    
    build_script = Path("scripts_utilitaires/build_exe.py")
    if not build_script.exists():
        print("  ❌ Script de build manquant")
        return False
    
    # Vérifier PyInstaller
    try:
        import PyInstaller
        print("  ✅ PyInstaller disponible")
    except ImportError:
        print("  ⚠️ PyInstaller non installé (optionnel)")
    
    # Vérifier que le fichier app.py existe
    app_file = Path("web_sentinel/gui/app.py")
    if app_file.exists():
        print("  ✅ Point d'entrée GUI disponible")
    else:
        print("  ❌ Point d'entrée GUI manquant")
        return False
    
    return True

def test_project_structure():
    """Tester la structure du projet après nettoyage."""
    print("\n📁 Test de la structure du projet...")
    
    required_dirs = [
        "web_sentinel",
        "tests", 
        "scripts_utilitaires",
        "archive_tests",
        "docs",
        "dist"
    ]
    
    required_files = [
        "README.md",
        "requirements.txt",
        "pytest.ini",
        "SAST-SPECIFICATION.md"
    ]
    
    success = True
    
    # Vérifier les dossiers
    for dir_name in required_dirs:
        if Path(dir_name).exists():
            print(f"  ✅ Dossier: {dir_name}/")
        else:
            print(f"  ❌ Dossier manquant: {dir_name}/")
            success = False
    
    # Vérifier les fichiers
    for file_name in required_files:
        if Path(file_name).exists():
            print(f"  ✅ Fichier: {file_name}")
        else:
            print(f"  ❌ Fichier manquant: {file_name}")
            success = False
    
    return success

def check_cleanup_result():
    """Vérifier le résultat du nettoyage."""
    print("\n🧹 Vérification du nettoyage...")
    
    # Vérifier que les fichiers obsolètes ont été supprimés
    obsolete_files = [
        "lancement.py",
        "gui_entry.py", 
        "test_degrisage_sast.py",
        "demo_sast_complete.py",
        "check_accounts.py"
    ]
    
    success = True
    for file_name in obsolete_files:
        if not Path(file_name).exists():
            print(f"  ✅ Supprimé: {file_name}")
        else:
            print(f"  ⚠️ Encore présent: {file_name}")
    
    # Vérifier que les fichiers importants sont conservés
    important_files = [
        "demo_interface_moderne.py",
        "validation_finale_moderne.py",
        "validation_interface_moderne.py"
    ]
    
    for file_name in important_files:
        if Path(file_name).exists():
            print(f"  ✅ Conservé: {file_name}")
        else:
            print(f"  ❌ Perdu: {file_name}")
            success = False
    
    return success

def main():
    """Point d'entrée principal."""
    print("🔍 VALIDATION POST-NETTOYAGE WEB SENTINEL")
    print("=" * 50)
    
    tests = [
        ("Imports principaux", test_core_imports),
        ("Interface graphique", test_gui_functionality), 
        ("Scripts utilitaires", test_scripts_utilities),
        ("CLI", test_cli_functionality),
        ("Compilation", test_compilation),
        ("Structure projet", test_project_structure),
        ("Résultat nettoyage", check_cleanup_result)
    ]
    
    results = []
    for test_name, test_func in tests:
        print(f"\n📋 {test_name}:")
        try:
            result = test_func()
            results.append((test_name, result))
        except Exception as e:
            print(f"  ❌ Erreur dans {test_name}: {e}")
            results.append((test_name, False))
    
    # Résumé
    print("\n" + "=" * 50)
    print("📊 RÉSUMÉ DE LA VALIDATION:")
    
    all_success = True
    for test_name, success in results:
        status = "✅" if success else "❌"
        print(f"  {status} {test_name}")
        all_success &= success
    
    if all_success:
        print("\n🎉 VALIDATION COMPLÈTE RÉUSSIE!")
        print("\n✨ Le projet est maintenant:")
        print("  • 🧹 Nettoyé et organisé")
        print("  • 📁 Structure claire et logique") 
        print("  • 🔧 Entièrement fonctionnel")
        print("  • 🚀 Prêt pour le développement")
        
        print("\n📋 Prochaines étapes recommandées:")
        print("  1. 🔨 Compiler: python scripts_utilitaires/build_exe.py")
        print("  2. 🧪 Tests: python scripts_utilitaires/run_tests.py")
        print("  3. 🖥️ Interface: python -m web_sentinel.gui.app")
        
    else:
        print("\n❌ VALIDATION ÉCHOUÉE")
        print("Des problèmes ont été détectés, vérifiez les erreurs ci-dessus.")
        return 1
    
    return 0

if __name__ == "__main__":
    sys.exit(main())