"""
Script de compilation Web Sentinel en exécutable Windows (.exe)
Utilise PyInstaller pour créer un fichier .exe standalone
"""

import os
import sys
import subprocess
import shutil
from pathlib import Path

def check_pyinstaller():
    """Vérifie si PyInstaller est installé."""
    try:
        import PyInstaller
        return True
    except ImportError:
        return False

def install_pyinstaller():
    """Installe PyInstaller via pip."""
    print("🔧 Installation de PyInstaller...")
    try:
        subprocess.run([sys.executable, "-m", "pip", "install", "pyinstaller"], check=True)
        print("✅ PyInstaller installé avec succès")
        return True
    except subprocess.CalledProcessError:
        print("❌ Erreur lors de l'installation de PyInstaller")
        return False

def clean_build_dirs():
    """Nettoie les dossiers de build précédents."""
    dirs_to_clean = ["build", "dist", "__pycache__"]
    for dir_name in dirs_to_clean:
        if os.path.exists(dir_name):
            print(f"🧹 Nettoyage du dossier {dir_name}/")
            shutil.rmtree(dir_name)
    
    # Nettoyer les fichiers .spec
    for spec_file in Path(".").glob("*.spec"):
        print(f"🧹 Suppression de {spec_file}")
        spec_file.unlink()

def create_exe():
    """Compile l'application en .exe avec PyInstaller."""
    print("\n🚀 Compilation de Web Sentinel en .exe...")
    
    # Commande PyInstaller
    cmd = [
        sys.executable, "-m", "PyInstaller",
        "--onefile",                    # Un seul fichier exécutable
        "--windowed",                   # Interface graphique (pas de console)
        "--name=WebSentinel",           # Nom de l'exécutable
        "--add-data=web_sentinel;web_sentinel",  # Inclure le package web_sentinel
        "--hidden-import=tkinter",      # Importer tkinter explicitement
        "--hidden-import=tkinter.ttk",  # Importer tkinter.ttk
        "--hidden-import=requests",     # Importer requests
        "--hidden-import=ssl",          # Importer ssl
        "--hidden-import=socket",       # Importer socket
        "--hidden-import=concurrent.futures",  # Importer concurrent.futures
        "--hidden-import=threading",    # Importer threading
        "web_sentinel/gui/app.py"       # Script principal
    ]
    
    # Ajouter l'icône si elle existe
    if os.path.exists("web_sentinel/gui/icon.ico"):
        cmd.insert(-1, "--icon=web_sentinel/gui/icon.ico")
    

    
    try:
        print("📦 Exécution de PyInstaller...")
        print(f"Commande: {' '.join(cmd)}")
        
        result = subprocess.run(cmd, check=True, capture_output=True, text=True)
        
        print("✅ Compilation réussie!")
        
        # Vérifier que le fichier .exe a été créé
        exe_path = Path("dist/WebSentinel.exe")
        if exe_path.exists():
            exe_size = exe_path.stat().st_size / (1024 * 1024)  # Taille en MB
            print(f"📄 Exécutable créé: {exe_path}")
            print(f"📏 Taille: {exe_size:.1f} MB")
            
            # Créer un raccourci sur le bureau (optionnel)
            create_desktop_shortcut(exe_path)
            
            return True
        else:
            print("❌ L'exécutable n'a pas été trouvé dans dist/")
            return False
            
    except subprocess.CalledProcessError as e:
        print(f"❌ Erreur lors de la compilation: {e}")
        if e.stdout:
            print("STDOUT:", e.stdout)
        if e.stderr:
            print("STDERR:", e.stderr)
        return False

def create_desktop_shortcut(exe_path):
    """Crée un raccourci sur le bureau (Windows uniquement)."""
    try:
        import winshell
        desktop = winshell.desktop()
        shortcut_path = os.path.join(desktop, "Web Sentinel.lnk")
        
        with winshell.shortcut(shortcut_path) as shortcut:
            shortcut.path = str(exe_path.absolute())
            shortcut.description = "Web Sentinel - Outil de diagnostic de sécurité web"
            shortcut.working_directory = str(exe_path.parent.absolute())
            
        print(f"🔗 Raccourci créé sur le bureau: {shortcut_path}")
    except ImportError:
        print("ℹ️  Module winshell non disponible - raccourci non créé")
    except Exception as e:
        print(f"⚠️  Impossible de créer le raccourci: {e}")

def main():
    """Point d'entrée principal du script de compilation."""
    print("🎯 Web Sentinel - Compilation en .exe")
    print("="*50)
    
    # Vérifier qu'on est dans le bon dossier
    if not os.path.exists("web_sentinel"):
        print("❌ Erreur: Dossier 'web_sentinel' non trouvé")
        print("   Lancez ce script depuis la racine du projet Web Sentinel")
        sys.exit(1)
    
    # Vérifier/installer PyInstaller
    if not check_pyinstaller():
        print("⚠️  PyInstaller non trouvé")
        if not install_pyinstaller():
            sys.exit(1)
    else:
        print("✅ PyInstaller est disponible")
    
    # Nettoyer les anciens builds
    clean_build_dirs()
    
    # Compiler l'application
    if create_exe():
        print("\n🎉 COMPILATION TERMINÉE AVEC SUCCÈS!")
        print("📂 Votre exécutable se trouve dans: dist/WebSentinel.exe")
        print("\n🚀 Pour lancer l'application:")
        print("   • Double-cliquez sur dist/WebSentinel.exe")
        print("   • Ou utilisez le raccourci sur le bureau (si créé)")
        
        # Proposer de lancer l'application
        response = input("\n❓ Voulez-vous lancer l'application maintenant ? (o/N): ")
        if response.lower() in ['o', 'oui', 'y', 'yes']:
            try:
                print("🚀 Lancement de Web Sentinel...")
                subprocess.Popen(["dist/WebSentinel.exe"])
            except Exception as e:
                print(f"❌ Erreur lors du lancement: {e}")
                print("   Vous pouvez lancer manuellement: dist/WebSentinel.exe")
    else:
        print("\n❌ ÉCHEC DE LA COMPILATION")
        print("   Vérifiez les erreurs ci-dessus")
        sys.exit(1)

if __name__ == "__main__":
    main()