#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Script d'installation automatique pour Web Sentinel.
Installe les dépendances et vérifie la configuration du système.
"""

import sys
import subprocess
import importlib
from pathlib import Path

# Configuration encodage sûre pour Windows
def safe_print(*args, **kwargs):
    """Print avec gestion d'encodage sûre pour Windows."""
    try:
        print(*args, **kwargs)
    except UnicodeEncodeError:
        # Fallback ASCII pour Windows
        safe_args = []
        for arg in args:
            if isinstance(arg, str):
                # Remplacer les emojis par des équivalents ASCII
                safe_arg = (arg.replace("🔍", "[CHECK]")
                           .replace("✅", "[OK]")
                           .replace("❌", "[ERROR]")
                           .replace("💡", "[TIP]")
                           .replace("⚠️", "[WARNING]")
                           .replace("📚", "[INFO]")
                           .replace("🛠️", "[INSTALL]")
                           .replace("📦", "[PACKAGE]")
                           .replace("📁", "[FOLDER]")
                           .replace("🧪", "[TEST]")
                           .replace("🎯", "[TARGET]")
                           .replace("🚀", "[USAGE]"))
                safe_args.append(safe_arg)
            else:
                safe_args.append(arg)
        print(*safe_args, **kwargs)

def check_python_version():
    """Vérifier la version Python."""
    safe_print("🔍 Vérification de la version Python...")
    if sys.version_info < (3, 11):
        safe_print("❌ Python 3.11+ requis (datetime.UTC support). Version actuelle:", sys.version)
        return False
    safe_print(f"✅ Python {sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}")
    return True

def check_pip():
    """Vérifier que pip est disponible."""
    safe_print("🔍 Vérification de pip...")
    try:
        import pip
        safe_print(f"✅ pip disponible")
        return True
    except ImportError:
        safe_print("❌ pip non disponible")
        safe_print("💡 Installez pip avec: python -m ensurepip --upgrade")
        return False

def install_requirements(requirements_file="requirements.txt"):
    """Installer les dépendances depuis requirements.txt."""
    safe_print(f"📦 Installation des dépendances depuis {requirements_file}...")
    
    if not Path(requirements_file).exists():
        safe_print(f"❌ Fichier {requirements_file} introuvable")
        return False
    
    try:
        result = subprocess.run([
            sys.executable, "-m", "pip", "install", "-r", requirements_file
        ], capture_output=True, text=True, check=True)
        
        safe_print("✅ Dépendances installées avec succès")
        return True
        
    except subprocess.CalledProcessError as e:
        safe_print(f"❌ Erreur lors de l'installation: {e}")
        safe_print("Sortie d'erreur:", e.stderr)
        return False

def check_optional_dependencies():
    """Vérifier les dépendances optionnelles."""
    safe_print("🔍 Vérification des dépendances optionnelles...")
    
    optional_deps = {
        "tkinter": "Interface graphique (GUI)",
        "bs4": "Analyse statique du DOM (BeautifulSoup4)",
    }
    
    available = {}
    for dep, description in optional_deps.items():
        try:
            if dep == "tkinter":
                import tkinter
                available[dep] = True
                safe_print(f"✅ {dep}: {description}")
            elif dep == "bs4":
                import bs4
                available[dep] = True
                safe_print(f"✅ {dep}: {description}")
        except ImportError:
            available[dep] = False
            safe_print(f"⚠️ {dep}: {description} - Non disponible")
    
    return available

def check_core_dependencies():
    """Vérifier les dépendances principales."""
    safe_print("🔍 Vérification des dépendances principales...")
    
    core_deps = {
        "requests": "Requêtes HTTP",
        "jinja2": "Génération de rapports HTML",
        "yaml": "Configuration YAML",
    }
    
    missing = []
    for dep, description in core_deps.items():
        try:
            importlib.import_module(dep)
            safe_print(f"✅ {dep}: {description}")
        except ImportError:
            missing.append(dep)
            safe_print(f"❌ {dep}: {description} - MANQUANT")
    
    return len(missing) == 0

def setup_directories():
    """Créer les répertoires de configuration."""
    safe_print("📁 Configuration des répertoires...")
    
    config_dir = Path.home() / ".web-sentinel"
    config_dir.mkdir(exist_ok=True)
    
    subdirs = ["reports", "history", "logs"]
    for subdir in subdirs:
        (config_dir / subdir).mkdir(exist_ok=True)
    
    safe_print(f"✅ Répertoires configurés dans: {config_dir}")

def run_basic_tests():
    """Exécuter des tests de base."""
    safe_print("🧪 Tests de base...")
    
    try:
        # Test d'import des modules principaux
        from web_sentinel.model import ScanRequest, Finding
        from web_sentinel.orchestrator import build_default_modules
        safe_print("✅ Imports des modules principaux")
        
        # Test de création des modules
        modules = build_default_modules()
        safe_print(f"✅ {len(modules)} modules de scan disponibles")
        
        # Test de création d'une requête
        request = ScanRequest(domain="example.com")
        safe_print("✅ Création de requête de scan")
        
        return True
        
    except Exception as e:
        safe_print(f"❌ Erreur dans les tests: {e}")
        return False

def provide_next_steps(optional_deps):
    """Fournir les étapes suivantes.""" 
    safe_print("\n" + "="*60)
    safe_print("🎯 PROCHAINES ÉTAPES")
    safe_print("="*60)
    
    safe_print("✅ Installation de base terminée!")
    
    if not optional_deps.get("tkinter", False):
        safe_print("\n⚠️ Interface graphique non disponible:")
        safe_print("  • Ubuntu/Debian: sudo apt install python3-tk")
        safe_print("  • CentOS/RHEL: sudo yum install tkinter")
        safe_print("  • Windows: Généralement inclus avec Python")
        safe_print("  • macOS: Généralement inclus avec Python")
        safe_print("  • Alternative: Utilisez le mode headless")
    
    if not optional_deps.get("bs4", False):
        safe_print("\n⚠️ Analyse statique non disponible:")
        safe_print("  • Installez avec: pip install beautifulsoup4")
        safe_print("  • Ou utilisez les autres modules de scan")
    
    safe_print("\n🚀 Utilisation:")
    safe_print("  • CLI: python -m web_sentinel.cli example.com")
    safe_print("  • GUI: python -m web_sentinel.gui (si tkinter disponible)")
    safe_print("  • Headless: python -c 'from web_sentinel.gui.headless import HeadlessWebSentinelGUI; app = HeadlessWebSentinelGUI()'")
    
    safe_print("\n📚 Tests:")
    safe_print("  • Tests unitaires: pip install -r requirements-dev.txt && pytest")
    safe_print("  • Test simple: python test_translation_complete.py")

def main():
    """Point d'entrée principal."""
    safe_print("INSTALLATION WEB SENTINEL")
    safe_print("="*60)
    
    # Vérifications préalables
    if not check_python_version():
        return 1
    
    if not check_pip():
        return 1
    
    # Installation des dépendances
    if not install_requirements():
        safe_print("WARNING: Poursuite avec les dépendances disponibles...")
    
    # Vérifications post-installation
    if not check_core_dependencies():
        safe_print("ERROR: Des dépendances principales sont manquantes")
        safe_print("TIP: Essayez: pip install requests jinja2 pyyaml")
        return 1
    
    optional_deps = check_optional_dependencies()
    
    # Configuration
    setup_directories()
    
    # Tests
    if not run_basic_tests():
        safe_print("ERROR: Les tests de base ont échoué")
        return 1
    
    # Instructions finales
    provide_next_steps(optional_deps)
    
    return 0

if __name__ == "__main__":
    sys.exit(main())