#!/usr/bin/env python3
"""
SkillMate - Windows-optimierter Haupteinstiegspunkt
"""

import os
import sys
import subprocess
import time
import webbrowser
import signal
import atexit
from pathlib import Path

class SkillMateStarter:
    def __init__(self):
        self.processes = []
        self.base_dir = Path(__file__).parent.absolute()
        
        # Registriere Cleanup-Handler
        atexit.register(self.cleanup)
        if sys.platform != 'win32':
            signal.signal(signal.SIGINT, self.signal_handler)
            signal.signal(signal.SIGTERM, self.signal_handler)
        
    def signal_handler(self, signum, frame):
        """Handle Strg+C und andere Signale"""
        print("\n\n🛑 SkillMate wird beendet...")
        self.cleanup()
        sys.exit(0)
        
    def cleanup(self):
        """Beende alle gestarteten Prozesse"""
        for process in self.processes:
            try:
                if process.poll() is None:  # Prozess läuft noch
                    if sys.platform == 'win32':
                        subprocess.call(['taskkill', '/F', '/T', '/PID', str(process.pid)], 
                                      stdout=subprocess.DEVNULL, 
                                      stderr=subprocess.DEVNULL)
                    else:
                        process.terminate()
                        process.wait(timeout=5)
            except:
                pass
                    
    def check_node_npm(self):
        """Prüfe ob Node.js und npm installiert sind"""
        try:
            # Windows-spezifische Prüfung
            if sys.platform == 'win32':
                subprocess.run(["node", "--version"], 
                             capture_output=True, 
                             check=True, 
                             shell=True)
                subprocess.run(["npm", "--version"], 
                             capture_output=True, 
                             check=True, 
                             shell=True)
            else:
                subprocess.run(["node", "--version"], capture_output=True, check=True)
                subprocess.run(["npm", "--version"], capture_output=True, check=True)
            return True
        except (subprocess.CalledProcessError, FileNotFoundError):
            print("❌ Node.js und npm müssen installiert sein!")
            print("   Bitte installieren Sie Node.js von: https://nodejs.org/")
            return False
            
    def start_services_windows(self):
        """Starte alle Services in Windows mit separaten CMD-Fenstern"""
        print("🚀 Starte SkillMate Services...")
        
        # Backend
        backend_cmd = f'cd /d "{self.base_dir}\\backend" && npm run dev'
        subprocess.Popen(['cmd', '/c', f'start "SkillMate Backend" cmd /k {backend_cmd}'])
        
        # Warte bis Backend bereit ist
        print("   Warte auf Backend...")
        time.sleep(5)
        
        # Frontend
        frontend_cmd = f'cd /d "{self.base_dir}\\frontend" && npm run dev'
        subprocess.Popen(['cmd', '/c', f'start "SkillMate Frontend" cmd /k {frontend_cmd}'])
        
        # Admin Panel (optional)
        admin_dir = self.base_dir / "admin-panel"
        if admin_dir.exists():
            admin_cmd = f'cd /d "{admin_dir}" && npm run dev -- --port 5174'
            subprocess.Popen(['cmd', '/c', f'start "SkillMate Admin" cmd /k {admin_cmd}'])
        
        print("\n✨ SkillMate läuft!")
        print("\n📍 Zugriff:")
        print("   - Frontend: http://localhost:5173")
        print("   - Backend:  http://localhost:3001")
        print("   - Admin:    http://localhost:5174")
        
        # Öffne Frontend im Browser
        time.sleep(3)
        webbrowser.open("http://localhost:5173")
        
        print("\n⚡ Schließen Sie dieses Fenster, um SkillMate zu beenden")
        
        
    def run(self):
        """Hauptausführungsmethode"""
        print("🎯 SkillMate wird gestartet...\n")
        
        # Prüfe Voraussetzungen
        if not self.check_node_npm():
            return False
            
        # Windows-spezifischer Start
        if sys.platform == 'win32':
            self.start_services_windows()
            # Halte das Hauptfenster offen
            try:
                input("\nDrücken Sie Enter zum Beenden...")
            except KeyboardInterrupt:
                pass
        else:
            print("❌ Dieses Skript ist für Windows optimiert.")
            print("   Nutzen Sie 'python main.py' für andere Systeme.")
            return False
            
        return True

def main():
    """Haupteinstiegspunkt"""
    starter = SkillMateStarter()
    
    try:
        success = starter.run()
        if not success:
            sys.exit(1)
    except Exception as e:
        print(f"\n❌ Unerwarteter Fehler: {e}")
        starter.cleanup()
        sys.exit(1)

if __name__ == "__main__":
    main()