#!/usr/bin/env python3
"""
Script d'installation et de configuration pour le scraper Jobs.ch avancé
"""

import subprocess
import sys
import os
import json
import shutil
from pathlib import Path

class ScraperSetup:
    def __init__(self):
        self.requirements = [
            'selenium',
            'beautifulsoup4',
            'requests',
            'lxml',
            'pandas'  # optionnel pour l'analyse des données
        ]
        
        self.system_requirements = {
            'firefox': 'Firefox browser',
            'geckodriver': 'Firefox WebDriver',
            'python3': 'Python 3.7+'
        }
        
    def check_python_version(self):
        """Vérifier la version de Python"""
        print("🐍 Vérification de la version Python...")
        
        if sys.version_info < (3, 7):
            print("❌ Python 3.7+ requis. Version actuelle:", sys.version)
            return False
            
        print(f"✅ Python {sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}")
        return True
        
    def install_python_packages(self):
        """Installer les packages Python requis"""
        print("\n📦 Installation des packages Python...")
        
        failed_packages = []
        
        for package in self.requirements:
            try:
                print(f"🔄 Installation de {package}...")
                subprocess.check_call([sys.executable, "-m", "pip", "install", package])
                print(f"✅ {package} installé avec succès")
            except subprocess.CalledProcessError as e:
                print(f"❌ Échec installation {package}: {e}")
                failed_packages.append(package)
                
        if failed_packages:
            print(f"\n⚠️ Packages non installés: {', '.join(failed_packages)}")
            print("Essayez de les installer manuellement avec:")
            for pkg in failed_packages:
                print(f"  pip install {pkg}")
            return False
            
        return True
        
    def check_system_requirements(self):
        """Vérifier les dépendances système"""
        print("\n🔧 Vérification des dépendances système...")
        
        checks = {
            'firefox': self.check_firefox(),
            'geckodriver': self.check_geckodriver(),
            'php': self.check_php()
        }
        
        for requirement, status in checks.items():
            status_icon = "✅" if status else "❌"
            print(f"{status_icon} {requirement}: {'OK' if status else 'Manquant'}")
            
        return all(checks.values())
        
    def check_firefox(self):
        """Vérifier si Firefox est installé"""
        try:
            result = subprocess.run(['firefox', '--version'], 
                                  capture_output=True, text=True)
            return result.returncode == 0
        except FileNotFoundError:
            return False
            
    def check_geckodriver(self):
        """Vérifier si geckodriver est disponible"""
        try:
            result = subprocess.run(['geckodriver', '--version'], 
                                  capture_output=True, text=True)
            return result.returncode == 0
        except FileNotFoundError:
            return False
            
    def check_php(self):
        """Vérifier si PHP est disponible"""
        try:
            result = subprocess.run(['php', '--version'], 
                                  capture_output=True, text=True)
            return result.returncode == 0
        except FileNotFoundError:
            return False
            
    def install_geckodriver(self):
        """Guide pour installer geckodriver"""
        print("\n🔧 Installation de geckodriver...")
        print("Veuillez installer geckodriver manuellement:")
        print("1. Allez sur https://github.com/mozilla/geckodriver/releases")
        print("2. Téléchargez la dernière version pour votre système")
        print("3. Extrayez et placez geckodriver dans votre PATH")
        print("\nOu utilisez ces commandes:")
        print("Ubuntu/Debian: sudo apt install firefox-geckodriver")
        print("CentOS/RHEL: sudo yum install geckodriver")
        print("macOS: brew install geckodriver")
        
    def create_directory_structure(self):
        """Créer la structure des répertoires"""
        print("\n📁 Création de la structure des répertoires...")
        
        directories = [
            'logs',
            'exports',
            'temp',
            'configs',
            'backups'
        ]
        
        for directory in directories:
            Path(directory).mkdir(exist_ok=True)
            print(f"✅ Répertoire créé: {directory}/")
            
    def create_config_files(self):
        """Créer les fichiers de configuration"""
        print("\n⚙️ Création des fichiers de configuration...")
        
        # Configuration principale
        config = {
            "scraper": {
                "default_csv_path": "/root/liens/1jobs_ch_complete_extraction.csv",
                "default_delay": 3,
                "max_retries": 3,
                "timeout": 30,
                "headless_mode": True,
                "auto_retry_captcha": True
            },
            "browser": {
                "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
                "window_size": [1920, 1080],
                "page_load_timeout": 30,
                "implicit_wait": 5
            },
            "logging": {
                "level": "INFO",
                "max_file_size_mb": 10,
                "backup_count": 5,
                "format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
            },
            "export": {
                "default_format": "csv",
                "include_metadata": True,
                "max_jobs_per_export": 10000
            }
        }
        
        with open('configs/scraper_config.json', 'w', encoding='utf-8') as f:
            json.dump(config, f, indent=2, ensure_ascii=False)
            
        print("✅ Fichier de configuration créé: configs/scraper_config.json")
        
        # Script de démarrage
        startup_script = """#!/bin/bash
# Script de démarrage pour le scraper Jobs.ch

echo "🚀 Démarrage du serveur web pour l'interface..."

# Vérifier si le port 8080 est libre
if netstat -tuln | grep -q ":8080 "; then
    echo "⚠️ Le port 8080 est déjà utilisé"
    echo "Essayez un autre port ou arrêtez le service qui utilise le port 8080"
    exit 1
fi

# Démarrer le serveur PHP intégré
php -S localhost:8080 -t . > logs/webserver.log 2>&1 &

echo "✅ Serveur démarré sur http://localhost:8080"
echo "📊 Interface disponible à: http://localhost:8080/interface_scraper.php"
echo "🛑 Pour arrêter: kill $(pgrep -f 'php -S localhost:8080')"
"""
        
        with open('start_server.sh', 'w') as f:
            f.write(startup_script)
        os.chmod('start_server.sh', 0o755)
        
        print("✅ Script de démarrage créé: start_server.sh")
        
    def create_test_csv(self):
        """Créer un fichier CSV de test"""
        print("\n📝 Création d'un fichier CSV de test...")
        
        test_data = """URL,Description
https://www.jobs.ch/fr/emplois/detail/12345,Développeur Python Senior
https://www.jobs.ch/fr/emplois/detail/12346,Ingénieur DevOps
https://www.jobs.ch/fr/emplois/detail/12347,Data Scientist
https://www.jobs.ch/fr/emplois/detail/12348,Chef de projet IT
https://www.jobs.ch/fr/emplois/detail/12349,Analyste Business Intelligence
"""
        
        os.makedirs('test_data', exist_ok=True)
        with open('test_data/sample_links.csv', 'w', encoding='utf-8') as f:
            f.write(test_data)
            
        print("✅ Fichier CSV de test créé: test_data/sample_links.csv")
        
    def run_system_test(self):
        """Exécuter un test système basique"""
        print("\n🧪 Exécution des tests système...")
        
        try:
            # Test d'import des modules Python
            print("🔄 Test d'import des modules...")
            from selenium import webdriver
            from selenium.webdriver.firefox.options import Options
            from bs4 import BeautifulSoup
            print("✅ Tous les modules Python importés avec succès")
            
            # Test de création du driver (sans l'ouvrir)
            print("🔄 Test de configuration du driver Firefox...")
            options = Options()
            options.add_argument("--headless")
            print("✅ Configuration du driver Firefox OK")
            
            print("✅ Tests système réussis")
            return True
            
        except ImportError as e:
            print(f"❌ Erreur d'import: {e}")
            return False
        except Exception as e:
            print(f"❌ Erreur lors des tests: {e}")
            return False
            
    def display_post_install_info(self):
        """Afficher les informations post-installation"""
        print("\n" + "="*60)
        print("🎉 INSTALLATION TERMINÉE")
        print("="*60)
        print("\n📋 PROCHAINES ÉTAPES:")
        print("\n1. Configurer votre fichier CSV:")
        print("   - Placez vos liens d'emplois dans un fichier CSV")
        print("   - Modifiez le chemin dans configs/scraper_config.json si nécessaire")
        print("\n2. Démarrer le serveur web:")
        print("   ./start_server.sh")
        print("   ou")
        print("   php -S localhost:8080")
        print("\n3. Accéder à l'interface:")
        print("   http://localhost:8080/interface_scraper.php")
        print("\n4. Démarrer un scraping:")
        print("   - Via l'interface web (recommandé)")
        print("   - Ou directement: python3 jobs_scraper_cli.py --csv-file votre_fichier.csv")
        print("\n📁 FICHIERS CRÉÉS:")
        print("   - configs/scraper_config.json (configuration)")
        print("   - start_server.sh (démarrage serveur)")
        print("   - test_data/sample_links.csv (données de test)")
        print("   - logs/ (répertoire des logs)")
        print("   - exports/ (répertoire des exports)")
        print("\n⚠️  REMARQUES IMPORTANTES:")
        print("   - Assurez-vous que Firefox et geckodriver sont installés")
        print("   - Le scraping peut être détecté par les sites web")
        print("   - Respectez les conditions d'utilisation des sites")
        print("   - Utilisez des délais appropriés entre les requêtes")
        print("\n🆘 DÉPANNAGE:")
        print("   - Logs principaux: logs/scraper.log")
        print("   - Logs de debug: logs/scraper_debug.log")
        print("   - Status en temps réel: scraper_status.json")
        
    def run(self):
        """Exécuter l'installation complète"""
        print("🚀 INSTALLATION DU SCRAPER JOBS.CH AVANCÉ")
        print("="*50)
        
        steps = [
            ("Vérification Python", self.check_python_version),
            ("Installation des packages", self.install_python_packages),
            ("Vérification système", self.check_system_requirements),
            ("Création des répertoires", self.create_directory_structure),
            ("Création des configs", self.create_config_files),
            ("Création du CSV de test", self.create_test_csv),
            ("Tests système", self.run_system_test)
        ]
        
        failed_steps = []
        
        for step_name, step_func in steps:
            try:
                if not step_func():
                    failed_steps.append(step_name)
            except Exception as e:
                print(f"❌ Erreur dans {step_name}: {e}")
                failed_steps.append(step_name)
                
        print(f"\n📊 RÉSULTAT: {len(steps) - len(failed_steps)}/{len(steps)} étapes réussies")
        
        if failed_steps:
            print(f"⚠️ Étapes échouées: {', '.join(failed_steps)}")
            
        if not self.check_geckodriver():
            print("\n⚠️ ATTENTION: geckodriver n'est pas installé!")
            self.install_geckodriver()
            
        self.display_post_install_info()
        
        return len(failed_steps) == 0

if __name__ == "__main__":
    setup = ScraperSetup()
    success = setup.run()
    
    if not success:
        print("\n⚠️ Installation incomplète. Vérifiez les erreurs ci-dessus.")
        sys.exit(1)
    else:
        print("\n✅ Installation réussie!")
        sys.exit(0)