#!/usr/bin/env python3
"""
Script de démarrage rapide pour le scraper Jobs.ch
Lance tous les composants nécessaires et guide l'utilisateur
"""

import os
import sys
import json
import subprocess
import time
import signal
import argparse
from pathlib import Path
import webbrowser
from datetime import datetime

class QuickStartManager:
    def __init__(self):
        self.processes = {}
        self.config_dir = Path('configs')
        self.logs_dir = Path('logs')
        self.is_running = False
        
        # Gestionnaire de signaux pour arrêt propre
        signal.signal(signal.SIGTERM, self.signal_handler)
        signal.signal(signal.SIGINT, self.signal_handler)
        
    def signal_handler(self, signum, frame):
        """Gestionnaire pour arrêt propre"""
        print(f"\n🛑 Signal {signum} reçu, arrêt des services...")
        self.stop_all_services()
        sys.exit(0)
        
    def print_header(self):
        """Afficher l'en-tête du script"""
        print("=" * 70)
        print("🚀 JOBS.CH SCRAPER - DÉMARRAGE RAPIDE")
        print("=" * 70)
        print(f"📅 {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
        print()
        
    def check_prerequisites(self):
        """Vérifier les prérequis"""
        print("🔍 Vérification des prérequis...")
        
        issues = []
        
        # Fichiers requis
        required_files = [
            'jobs_scraper_cli.py',
            'scraper_control.php',
            'interface_scraper.php'
        ]
        
        for file_path in required_files:
            if not os.path.exists(file_path):
                issues.append(f"Fichier manquant: {file_path}")
                
        # Répertoires requis  
        required_dirs = ['logs', 'exports', 'configs']
        for dir_path in required_dirs:
            if not os.path.exists(dir_path):
                Path(dir_path).mkdir(exist_ok=True)
                print(f"📁 Répertoire créé: {dir_path}/")
                
        # Vérifier Python
        if sys.version_info < (3, 7):
            issues.append(f"Python 3.7+ requis (actuel: {sys.version_info.major}.{sys.version_info.minor})")
            
        # Vérifier les modules Python
        required_modules = ['selenium', 'bs4', 'requests']
        for module in required_modules:
            try:
                __import__(module)
            except ImportError:
                issues.append(f"Module Python manquant: {module}")
                
        # Vérifier les commandes système
        commands_to_check = [
            ('firefox', 'Firefox browser'),
            ('geckodriver', 'Firefox WebDriver'),
            ('php', 'PHP (pour interface web)')
        ]
        
        for cmd, description in commands_to_check:
            try:
                subprocess.run([cmd, '--version'], 
                             capture_output=True, check=True, timeout=5)
            except (subprocess.CalledProcessError, FileNotFoundError, subprocess.TimeoutExpired):
                issues.append(f"Commande manquante: {cmd} ({description})")
                
        if issues:
            print("❌ Problèmes détectés:")
            for issue in issues:
                print(f"   • {issue}")
            print()
            print("💡 Suggestions:")
            print("   • Exécutez: python3 install_and_setup.py")
            print("   • Consultez: python3 diagnostic_tool.py")
            return False
        else:
            print("✅ Tous les prérequis sont satisfaits")
            return True
            
    def create_default_config(self):
        """Créer une configuration par défaut si nécessaire"""
        config_file = self.config_dir / 'scraper_config.json'
        
        if not config_file.exists():
            print("⚙️ Création de la configuration par défaut...")
            
            default_config = {
                "scraper": {
                    "default_csv_path": "/root/liens/1jobs_ch_complete_extraction.csv",
                    "default_delay": 3,
                    "headless_mode": True,
                    "debug_mode": False
                },
                "logging": {
                    "level": "INFO",
                    "max_file_size_mb": 10
                }
            }
            
            self.config_dir.mkdir(exist_ok=True)
            with open(config_file, 'w', encoding='utf-8') as f:
                json.dump(default_config, f, indent=2, ensure_ascii=False)
                
            print(f"✅ Configuration créée: {config_file}")
            
    def start_web_server(self, port=8080):
        """Démarrer le serveur web PHP"""
        print(f"🌐 Démarrage du serveur web sur le port {port}...")
        
        # Vérifier si le port est libre
        import socket
        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
            if s.connect_ex(('localhost', port)) == 0:
                print(f"⚠️ Le port {port} est déjà utilisé")
                return False
                
        try:
            cmd = ['php', '-S', f'localhost:{port}', '-t', '.']
            process = subprocess.Popen(
                cmd,
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE,
                universal_newlines=True
            )
            
            self.processes['web_server'] = {
                'process': process,
                'description': f'Serveur web PHP (port {port})',
                'url': f'http://localhost:{port}/interface_scraper.php'
            }
            
            # Attendre un peu pour vérifier que le serveur démarre
            time.sleep(2)
            
            if process.poll() is None:
                print(f"✅ Serveur web démarré: http://localhost:{port}")
                return True
            else:
                print("❌ Échec du démarrage du serveur web")
                return False
                
        except Exception as e:
            print(f"❌ Erreur démarrage serveur web: {e}")
            return False
            
    def start_system_monitor(self):
        """Démarrer le monitoring système"""
        if not os.path.exists('system_monitor.py'):
            print("⚠️ system_monitor.py non trouvé, monitoring ignoré")
            return False
            
        print("📊 Démarrage du monitoring système...")
        
        try:
            cmd = [sys.executable, 'system_monitor.py', '--daemon']
            process = subprocess.Popen(
                cmd,
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE,
                universal_newlines=True
            )
            
            self.processes['monitor'] = {
                'process': process,
                'description': 'Monitoring système',
                'url': None
            }
            
            time.sleep(1)
            
            if process.poll() is None:
                print("✅ Monitoring système démarré")
                return True
            else:
                print("❌ Échec du démarrage du monitoring")
                return False
                
        except Exception as e:
            print(f"❌ Erreur démarrage monitoring: {e}")
            return False
            
    def show_service_status(self):
        """Afficher le statut des services"""
        print("\n📋 STATUT DES SERVICES:")
        print("-" * 50)
        
        for service_name, service_info in self.processes.items():
            process = service_info['process']
            description = service_info['description']
            
            if process.poll() is None:
                status = "🟢 Actif"
                pid = f"(PID: {process.pid})"
            else:
                status = "🔴 Arrêté"
                pid = ""
                
            print(f"{description:<30} {status} {pid}")
            
            if service_info['url']:
                print(f"   └─ URL: {service_info['url']}")
                
    def open_web_interface(self):
        """Ouvrir l'interface web dans le navigateur"""
        web_server = self.processes.get('web_server')
        if web_server and web_server['process'].poll() is None:
            url = web_server['url']
            print(f"\n🌐 Ouverture de l'interface web: {url}")
            try:
                webbrowser.open(url)
                return True
            except Exception as e:
                print(f"⚠️ Impossible d'ouvrir le navigateur: {e}")
                print(f"   Ouvrez manuellement: {url}")
                return False
        else:
            print("❌ Serveur web non actif")
            return False
            
    def interactive_scraping_setup(self):
        """Guide interactif pour configurer un scraping"""
        print("\n🎯 CONFIGURATION DU SCRAPING")
        print("-" * 40)
        
        # Demander le fichier CSV
        csv_file = input("📁 Chemin vers votre fichier CSV (ou ENTER pour défaut): ").strip()
        if not csv_file:
            csv_file = "/root/liens/1jobs_ch_complete_extraction.csv"
            
        # Vérifier si le fichier existe
        if not os.path.exists(csv_file):
            print(f"⚠️ Fichier non trouvé: {csv_file}")
            create_sample = input("Créer un fichier d'exemple? (o/N): ").strip().lower()
            if create_sample in ['o', 'oui', 'y', 'yes']:
                self.create_sample_csv(csv_file)
            else:
                return None
                
        # Autres paramètres
        try:
            max_links = input("🔢 Nombre max de liens (ENTER pour illimité): ").strip()
            max_links = int(max_links) if max_links else None
        except ValueError:
            max_links = None
            
        try:
            delay = input("⏱️ Délai entre liens en secondes (défaut: 3): ").strip()
            delay = int(delay) if delay else 3
        except ValueError:
            delay = 3
            
        debug_mode = input("🐛 Mode debug? (o/N): ").strip().lower() in ['o', 'oui', 'y', 'yes']
        headless_mode = input("👻 Mode headless? (O/n): ").strip().lower() not in ['n', 'non', 'no']
        
        return {
            'csv_file': csv_file,
            'max_links': max_links,
            'delay': delay,
            'debug': debug_mode,
            'headless': headless_mode
        }
        
    def create_sample_csv(self, csv_path):
        """Créer un fichier CSV d'exemple"""
        print(f"📝 Création du fichier d'exemple: {csv_path}")
        
        os.makedirs(os.path.dirname(csv_path), exist_ok=True)
        
        sample_content = """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
"""
        
        with open(csv_path, 'w', encoding='utf-8') as f:
            f.write(sample_content)
            
        print(f"✅ Fichier d'exemple créé avec 5 liens de test")
        
    def start_scraping(self, config):
        """Démarrer le scraping avec la configuration donnée"""
        print("\n🚀 DÉMARRAGE DU SCRAPING")
        print("-" * 30)
        
        cmd = [sys.executable, 'jobs_scraper_cli.py']
        cmd.extend(['--csv-file', config['csv_file']])
        cmd.extend(['--delay', str(config['delay'])])
        
        if config['max_links']:
            cmd.extend(['--max-links', str(config['max_links'])])
            
        if config['debug']:
            cmd.append('--debug')
            
        if config['headless']:
            cmd.append('--headless')
            
        print(f"📋 Commande: {' '.join(cmd)}")
        
        try:
            process = subprocess.Popen(cmd)
            
            self.processes['scraper'] = {
                'process': process,
                'description': 'Scraper principal',
                'url': None
            }
            
            print("✅ Scraping démarré")
            print("💡 Surveillez le progrès via l'interface web")
            
            return True
            
        except Exception as e:
            print(f"❌ Erreur démarrage scraping: {e}")
            return False
            
    def stop_all_services(self):
        """Arrêter tous les services"""
        print("\n🛑 Arrêt des services...")
        
        for service_name, service_info in self.processes.items():
            process = service_info['process']
            description = service_info['description']
            
            if process.poll() is None:
                print(f"   Arrêt de {description}...")
                try:
                    process.terminate()
                    process.wait(timeout=5)
                    print(f"   ✅ {description} arrêté")
                except subprocess.TimeoutExpired:
                    process.kill()
                    print(f"   ⚠️ {description} forcé à s'arrêter")
                except Exception as e:
                    print(f"   ❌ Erreur arrêt {description}: {e}")
                    
        self.processes.clear()
        self.is_running = False
        
    def show_main_menu(self):
        """Afficher le menu principal"""
        while True:
            print("\n" + "=" * 50)
            print("🎛️  MENU PRINCIPAL")
            print("=" * 50)
            print("1. 🚀 Démarrer un nouveau scraping")
            print("2. 📊 Voir le statut des services")
            print("3. 🌐 Ouvrir l'interface web")
            print("4. 📈 Analyser les résultats")
            print("5. 🧹 Maintenance système")
            print("6. 💾 Créer une sauvegarde")
            print("7. 🔧 Outils de diagnostic")
            print("8. 🛑 Arrêter tous les services")
            print("9. ❌ Quitter")
            
            try:
                choice = input("\nVotre choix (1-9): ").strip()
                
                if choice == '1':
                    scraping_config = self.interactive_scraping_setup()
                    if scraping_config:
                        self.start_scraping(scraping_config)
                        
                elif choice == '2':
                    self.show_service_status()
                    
                elif choice == '3':
                    self.open_web_interface()
                    
                elif choice == '4':
                    self.run_results_analysis()
                    
                elif choice == '5':
                    self.run_maintenance()
                    
                elif choice == '6':
                    self.create_backup()
                    
                elif choice == '7':
                    self.run_diagnostic()
                    
                elif choice == '8':
                    self.stop_all_services()
                    
                elif choice == '9':
                    self.stop_all_services()
                    break
                    
                else:
                    print("⚠️ Choix invalide")
                    
            except KeyboardInterrupt:
                print("\n🛑 Interruption détectée")
                self.stop_all_services()
                break
                
    def run_results_analysis(self):
        """Lancer l'analyse des résultats"""
        if not os.path.exists('results_analyzer.py'):
            print("❌ results_analyzer.py non trouvé")
            return
            
        print("📈 Lancement de l'analyse des résultats...")
        subprocess.run([sys.executable, 'results_analyzer.py'])
        
    def run_maintenance(self):
        """Lancer la maintenance système"""
        if not os.path.exists('maintenance.py'):
            print("❌ maintenance.py non trouvé")
            return
            
        print("🧹 Lancement de la maintenance système...")
        subprocess.run([sys.executable, 'maintenance.py'])
        
    def create_backup(self):
        """Créer une sauvegarde"""
        if not os.path.exists('backup_manager.py'):
            print("❌ backup_manager.py non trouvé")
            return
            
        print("💾 Création d'une sauvegarde...")
        subprocess.run([sys.executable, 'backup_manager.py', 'backup'])
        
    def run_diagnostic(self):
        """Lancer le diagnostic système"""
        if not os.path.exists('diagnostic_tool.py'):
            print("❌ diagnostic_tool.py non trouvé")
            return
            
        print("🔧 Lancement du diagnostic système...")
        subprocess.run([sys.executable, 'diagnostic_tool.py'])
        
    def run_full_setup(self, auto_start_scraping=False):
        """Lancer la configuration complète"""
        self.print_header()
        
        # Vérifications
        if not self.check_prerequisites():
            print("\n❌ Prérequis non satisfaits")
            print("💡 Exécutez d'abord: python3 install_and_setup.py")
            return False
            
        # Configuration
        self.create_default_config()
        
        # Services
        services_started = 0
        
        if self.start_web_server():
            services_started += 1
            
        if self.start_system_monitor():
            services_started += 1
            
        print(f"\n✅ {services_started} service(s) démarré(s)")
        
        self.is_running = True
        
        # Auto-démarrage du scraping si demandé
        if auto_start_scraping:
            scraping_config = {
                'csv_file': '/root/liens/1jobs_ch_complete_extraction.csv',
                'max_links': None,
                'delay': 3,
                'debug': False,
                'headless': True
            }
            self.start_scraping(scraping_config)
        
        # Menu interactif
        try:
            time.sleep(2)  # Laisser le temps aux services de démarrer
            if not auto_start_scraping:
                self.open_web_interface()
                self.show_main_menu()
        except KeyboardInterrupt:
            print("\n🛑 Interruption détectée")
            
        finally:
            self.stop_all_services()
            
        return True

def main():
    parser = argparse.ArgumentParser(description='Démarrage rapide du scraper Jobs.ch')
    parser.add_argument('--auto-start', action='store_true', 
                       help='Démarrer automatiquement le scraping')
    parser.add_argument('--port', type=int, default=8080,
                       help='Port du serveur web (défaut: 8080)')
    parser.add_argument('--no-browser', action='store_true',
                       help='Ne pas ouvrir le navigateur automatiquement')
    
    args = parser.parse_args()
    
    try:
        manager = QuickStartManager()
        success = manager.run_full_setup(auto_start_scraping=args.auto_start)
        return 0 if success else 1
        
    except KeyboardInterrupt:
        print("\n🛑 Arrêt demandé par l'utilisateur")
        return 0
    except Exception as e:
        print(f"❌ Erreur: {e}")
        return 1

if __name__ == "__main__":
    exit(main())