#!/usr/bin/env python3
"""
WireGuard VPN Installer - One-liner Installation Script
Usage: curl -sSL https://api.bolzo.net/install.py | python3
"""
import os
import sys
import subprocess
from pathlib import Path

# Installiere und importiere rich
try:
    from rich.console import Console
    from rich.panel import Panel
    from rich.text import Text
    from rich.align import Align
except ImportError:
    print("Installing required library...")
    subprocess.run([sys.executable, "-m", "pip", "install", "-q", "rich"], check=False)
    from rich.console import Console
    from rich.panel import Panel
    from rich.text import Text
    from rich.align import Align

console = Console()

# ============================================================================
# CONFIGURATION
# ============================================================================
API_URL = "http://api-v.bolzo.net:8001"
VPNHOST = "vpn.bolzo.net"
CHECK_PORT = 51820
WIREGUARD_CONFIG_DIR = Path("/etc/wireguard")
WG_INTERFACE = "wg0"

# ============================================================================

class VPNManager:
    def __init__(self):
        self.password = None
        self.vpn_status = "Unbekannt"
        
    def check_root(self):
        """Prüft ob Skript als Root ausgeführt wird"""
        if os.geteuid() != 0:
            return False
        return True
    
    def ask_password(self):
        """Fragt Passwort ab"""
        try:
            console.print("\n[bold cyan]API Passwort:[/bold cyan]")
            password = input().strip()
            
            if password:
                self.password = password
                return True
            return False
        except (KeyboardInterrupt, EOFError):
            return False
    
    def check_vpn_reachability(self):
        """Prüft ob VPN Server erreichbar ist"""
        try:
            result = subprocess.run(
                ["ping", "-c", "1", "-W", "2", VPNHOST],
                capture_output=True,
                timeout=5
            )
            if result.returncode == 0:
                self.vpn_status = "✓ vpn.bolzo.net ist erreichbar"
            else:
                self.vpn_status = "✗ vpn.bolzo.net nicht erreichbar"
        except Exception as e:
            self.vpn_status = "✗ Netzwerk nicht verfügbar"
    
    def install_wireguard(self):
        """Installiert WireGuard"""
        try:
            console.print("  [cyan]•[/cyan] Aktualisiere Paketlisten...")
            subprocess.run(["apt-get", "update"], check=True, capture_output=True, timeout=60)
            console.print("  [cyan]•[/cyan] Installiere WireGuard...")
            subprocess.run(["apt-get", "install", "-y", "wireguard", "wireguard-tools"], 
                          check=True, capture_output=True, timeout=120)
            return True
        except Exception as e:
            console.print(f"  [red]✗ Fehler: {e}[/red]")
            return False
    
    def uninstall_wireguard(self):
        """Deinstalliert WireGuard"""
        try:
            console.print("  [cyan]•[/cyan] Deinstalliere WireGuard...")
            subprocess.run(["apt-get", "remove", "-y", "wireguard", "wireguard-tools"], 
                          check=True, capture_output=True, timeout=60)
            return True
        except Exception as e:
            console.print(f"  [red]✗ Fehler: {e}[/red]")
            return False

def show_menu(vpn_manager):
    """Menü mit Rich"""
    while True:
        try:
            os.system("clear")
            
            # Header
            title_text = Text("WireGuard VPN Manager", style="bold cyan")
            console.print(Panel(title_text, expand=False, border_style="cyan", padding=(1, 2)))
            console.print()
            
            # Menu Options
            console.print("[bold]Optionen:[/bold]")
            console.print("  [cyan]1[/cyan]. WireGuard installieren")
            console.print("  [cyan]2[/cyan]. WireGuard deinstallieren")
            console.print("  [cyan]3[/cyan]. Beenden")
            console.print()
            
            # Status
            vpn_manager.check_vpn_reachability()
            if "✓" in vpn_manager.vpn_status:
                status_panel = Panel(vpn_manager.vpn_status, border_style="green", padding=(0, 1))
            else:
                status_panel = Panel(vpn_manager.vpn_status, border_style="red", padding=(0, 1))
            console.print(status_panel)
            console.print()
            
            # Input
            try:
                choice = input("Wähle eine Option (1-3): ").strip()
            except (EOFError, KeyboardInterrupt):
                break
            
            if not choice:
                continue
            
            if choice == "1":
                console.print()
                console.print("[bold cyan]Installiere WireGuard...[/bold cyan]")
                if vpn_manager.install_wireguard():
                    console.print("[bold green]✓ Erfolgreich installiert![/bold green]")
                else:
                    console.print("[bold red]✗ Installation fehlgeschlagen![/bold red]")
                try:
                    input("\nDrücke Enter zum Fortfahren...")
                except (EOFError, KeyboardInterrupt):
                    break
            
            elif choice == "2":
                console.print()
                console.print("[bold cyan]Deinstalliere WireGuard...[/bold cyan]")
                if vpn_manager.uninstall_wireguard():
                    console.print("[bold green]✓ Erfolgreich deinstalliert![/bold green]")
                else:
                    console.print("[bold red]✗ Deinstallation fehlgeschlagen![/bold red]")
                try:
                    input("Drücke Enter zum Fortfahren...")
                except EOFError:
                    break
            
            elif choice == "3":
                break
            
            else:
                console.print("[bold red]✗ Ungültige Option![/bold red]")
                try:
                    input("\nDrücke Enter zum Fortfahren...")
                except (EOFError, KeyboardInterrupt):
                    break
        
        except (KeyboardInterrupt, EOFError):
            sys.stderr.write("\n")
            break
        except Exception as e:
            console.print(f"[bold red]✗ Fehler im Menü: {e}[/bold red]")
            sys.stderr.flush()
            break

def main():
    """Hauptfunktion"""
    console.print()
    title_text = Text("WireGuard VPN Manager", style="bold cyan")
    console.print(Align.center(Panel(title_text, border_style="cyan", padding=(1, 4))))
    console.print()
    
    # Prüfe Root
    vpn_manager = VPNManager()
    if not vpn_manager.check_root():
        console.print("[bold red]✗ Dieses Skript muss mit sudo ausgeführt werden![/bold red]")
        return False
    
    console.print()
    
    # Frage Passwort ab
    if not vpn_manager.ask_password():
        console.print("\n[bold red]✗ Passwort abgebrochen.[/bold red]")
        return False
    
    console.print()
    
    # Starte Menü
    try:
        show_menu(vpn_manager)
    except KeyboardInterrupt:
        console.print("\n[bold red]✗ Abgebrochen.[/bold red]")
    
    console.print("\n[bold green]✓ Auf Wiedersehen![/bold green]")
    return True

if __name__ == "__main__":
    try:
        main()
    except Exception as e:
        console.print(f"[bold red]✗ Fehler: {e}[/bold red]")
 
