@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion

:: UAC-Elevation prüfen und anfordern
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
if '%errorlevel%' NEQ '0' (
    echo Administratorrechte erforderlich. Starte Script als Administrator...
    goto UACPrompt
) else ( 
    goto gotAdmin 
)

:UACPrompt
    echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
    echo UAC.ShellExecute "%~s0", "%*", "", "runas", 1 >> "%temp%\getadmin.vbs"
    "%temp%\getadmin.vbs"
    del "%temp%\getadmin.vbs"
    exit /B

:gotAdmin
    pushd "%CD%"
    CD /D "%~dp0"

:: Parameter prüfen
if "%~1"=="" (
    echo Fehler: Keine WireGuard-Konfigurationsdatei angegeben.
    echo Verwendung: %0 ^<pfad_zur_wireguard_config^>
    pause
    exit /b 1
)

set "CONFIG_FILE=%~1"

:: Prüfen ob Konfigurationsdatei existiert
if not exist "%CONFIG_FILE%" (
    echo Fehler: Konfigurationsdatei "%CONFIG_FILE%" nicht gefunden.
    echo es wird ein WireGuard-Configfile als Parameter erwartet
    pause
    exit /b 1
)

echo WireGuard Installation und Konfiguration wird gestartet...

:: WireGuard Installation prüfen und ggf. installieren
winget  >nul 2>&1
if errorlevel 1 (
	echo Fehler: winget lässt sich nicht ausführen
	pause >nul
	exit /b 1
)
echo "Es wird ein Wireguard Service eingerichtet. <strg>+<c> zum beenden, <enter> weiter"
pause >nul

echo Prüfe WireGuard Installation...
winget install --id WireGuard.WireGuard --silent --accept-package-agreements --accept-source-agreements

echo Installiere Microsoft Visual C++ Redistributable...
winget install --id Microsoft.VCRedist.2015+.x64 --accept-package-agreements --accept-source-agreements

:: Config-Verzeichnis erstellen
set "CONFIG_DIR=%PROGRAMFILES%\WireGuard\config"
echo Erstelle Konfigurationsverzeichnis: %CONFIG_DIR%

if not exist "%CONFIG_DIR%" (
    mkdir "%CONFIG_DIR%"
    if errorlevel 1 (
        echo Fehler: Konnte Konfigurationsverzeichnis nicht erstellen.
        pause
        exit /b 1
    )
)

:: Berechtigungen setzen - Vererbung entfernen und nur Admin/LocalSystem
echo Setze Berechtigungen für Konfigurationsverzeichnis...
icacls "%CONFIG_DIR%" /inheritance:d >nul 2>&1
icacls "%CONFIG_DIR%" /grant:r "Administratoren:(OI)(CI)F" >nul 2>&1
icacls "%CONFIG_DIR%" /grant:r "SYSTEM:(OI)(CI)F" >nul 2>&1
icacls "%CONFIG_DIR%" /remove "Benutzer" >nul 2>&1
icacls "%CONFIG_DIR%" /remove "Authentifizierte Benutzer" >nul 2>&1

:: Konfigurationsdatei kopieren
set "WG_CONFIG=%CONFIG_DIR%\wg0.conf"
echo Kopiere Konfigurationsdatei nach %WG_CONFIG%...
copy "%CONFIG_FILE%" "%WG_CONFIG%" >nul
if errorlevel 1 (
    echo Fehler: Konnte Konfigurationsdatei nicht kopieren.
    pause
    exit /b 1
)

:: WireGuard Tunnel Service installieren
echo Installiere WireGuard Tunnel Service...
"%PROGRAMFILES%\WireGuard\wireguard.exe" /installtunnelservice "%WG_CONFIG%"

:: Service-Berechtigungen setzen
echo Setze Service-Berechtigungen...
sc sdset "WireGuardTunnel$wg0" "D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;RPWPDTRCWD;;;AU)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)" >nul 2>&1

:: Zusätzliche Dateien kopieren
set "SCRIPT_DIR=%~dp0"
set "WG_DIR=%PROGRAMFILES%\WireGuard"

echo Kopiere zusätzliche Dateien...

:: WireGuardMon.exe kopieren
copy "%SCRIPT_DIR%wireguardmon.exe" "%WG_DIR%\" >nul
if errorlevel 1 (
	echo Warnung: Konnte wireguardmon.exe nicht kopieren.
	pause
) else (
	echo wireguardmon.exe erfolgreich kopiert.
)

:: VPNTray.exe kopieren
copy "%SCRIPT_DIR%VPNTray.exe" "%WG_DIR%\" >nul
if errorlevel 1 (
	echo Warnung: Konnte VPNTray.exe nicht kopieren.
	pause
) else (
	echo VPNTray.exe erfolgreich kopiert.
)

:: VPNTray.ini kopieren
copy "%SCRIPT_DIR%VPNTray.ini" "%WG_DIR%\" >nul
if errorlevel 1 (
	echo Warnung: Konnte VPNTray.ini nicht kopieren.
	pause
) else (
	echo VPNTray.ini erfolgreich kopiert.
)

:: WireGuardMon installieren
if exist "%WG_DIR%\wireguardmon.exe" (
    echo Installiere WireGuardMon...
    pushd "%WG_DIR%"
    wireguardmon.exe --install
    if errorlevel 1 (
        echo Warnung: WireGuardMon Installation fehlgeschlagen.
        pause 
    ) else (
        echo WireGuardMon erfolgreich installiert.
        net start wireguardmon
    )
    popd
) else (
    echo Warnung: WireGuardMon nicht verfügbar - Installation übersprungen.
    pause >nul
)

:: Autostart-Eintrag für VPNTray.exe erstellen
if exist "%WG_DIR%\VPNTray.exe" (
    echo Erstelle Autostart-Eintrag für VPNTray...
    reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /v "VPNTray" /t REG_SZ /d "\"%WG_DIR%\VPNTray.exe\"" /f >nul 2>&1
    if errorlevel 1 (
        echo Warnung: Autostart-Eintrag konnte nicht erstellt werden.
        pause
    ) else (
        echo Autostart-Eintrag für VPNTray erfolgreich erstellt.
    )
	start "" explorer.exe "%WG_DIR%\VPNTray.exe"
) else (
    echo Warnung: VPNTray.exe nicht verfügbar - Autostart-Eintrag übersprungen.
)

echo.
echo Drücke eine beliebige Taste zum Beenden...
pause >nul

endlocal
