@echo off
chcp 65001 >nul 2>&1
setlocal enabledelayedexpansion

:: ═══════════════════════════════════════════════════════════════
:: StreCoin — Windows Installer
:: ═══════════════════════════════════════════════════════════════
:: Doppelklick genuegt. Installiert StreCoin und startet sofort.
::
:: Was passiert:
::   1. Kopiert strecoin.exe nach %USERPROFILE%\StreCoin
::   2. Erstellt Desktop-Verknuepfung
::   3. Erstellt Start-Menue Eintrag
::   4. Erstellt Uninstaller (Programme hinzufuegen/entfernen)
::   5. Erstellt Firewall-Regel fuer P2P
::   6. Startet StreCoin + oeffnet Dashboard
:: ═══════════════════════════════════════════════════════════════

title StreCoin Installer

:: Pfade
set "INSTALL_DIR=%USERPROFILE%\StreCoin"
set "DATA_DIR=%INSTALL_DIR%\data"
set "BINARY=%INSTALL_DIR%\strecoin.exe"
set "LAUNCHER=%INSTALL_DIR%\start.bat"
set "SCRIPT_DIR=%~dp0"
set "PORT=8080"

:: Version lesen
set "VER=0.10.12"
if exist "%SCRIPT_DIR%VERSION" (
    set /p VER=<"%SCRIPT_DIR%VERSION"
)

:: ─────────────────────────────────────────────────────────────
:: Banner
:: ─────────────────────────────────────────────────────────────
color 1F
echo.
echo.
echo   ███████╗████████╗██████╗ ███████╗ ██████╗ ██████╗ ██╗███╗   ██╗
echo   ██╔════╝╚══██╔══╝██╔══██╗██╔════╝██╔════╝██╔═══██╗██║████╗  ██║
echo   ███████╗   ██║   ██████╔╝█████╗  ██║     ██║   ██║██║██╔██╗ ██║
echo   ╚════██║   ██║   ██╔══██╗██╔══╝  ██║     ██║   ██║██║██║╚██╗██║
echo   ███████║   ██║   ██║  ██║███████╗╚██████╗╚██████╔╝██║██║ ╚████║
echo   ╚══════╝   ╚═╝   ╚═╝  ╚═╝╚══════╝ ╚═════╝ ╚═════╝ ╚═╝╚═╝  ╚═══╝
echo.
echo   Version %VER% — Installer
echo.
echo   ═══════════════════════════════════════════════════════════
echo.

:: ─────────────────────────────────────────────────────────────
:: Binary pruefen
:: ─────────────────────────────────────────────────────────────
if not exist "%SCRIPT_DIR%strecoin.exe" (
    echo   FEHLER: strecoin.exe nicht gefunden!
    echo.
    echo   Bitte stelle sicher, dass strecoin.exe im selben
    echo   Ordner wie dieser Installer liegt.
    echo.
    pause
    exit /b 1
)

:: ─────────────────────────────────────────────────────────────
:: Laufende Instanz beenden
:: ─────────────────────────────────────────────────────────────
tasklist /FI "IMAGENAME eq strecoin.exe" 2>nul | findstr /i "strecoin.exe" >nul 2>&1
if %errorlevel% equ 0 (
    echo   Beende laufende StreCoin-Instanz...
    taskkill /F /IM strecoin.exe >nul 2>&1
    timeout /t 2 /nobreak >nul
)

:: ─────────────────────────────────────────────────────────────
:: Schritt 1: Verzeichnisse erstellen
:: ─────────────────────────────────────────────────────────────
echo   [1/5] Installationsverzeichnis erstellen...

if not exist "%INSTALL_DIR%" mkdir "%INSTALL_DIR%"
if not exist "%DATA_DIR%" mkdir "%DATA_DIR%"
if not exist "%DATA_DIR%\logs" mkdir "%DATA_DIR%\logs"

echo         %INSTALL_DIR%
echo.

:: ─────────────────────────────────────────────────────────────
:: Schritt 2: Dateien kopieren
:: ─────────────────────────────────────────────────────────────
echo   [2/5] Dateien installieren...

copy /Y "%SCRIPT_DIR%strecoin.exe" "%BINARY%" >nul
echo         strecoin.exe kopiert

if exist "%SCRIPT_DIR%start.bat" (
    copy /Y "%SCRIPT_DIR%start.bat" "%LAUNCHER%" >nul
    echo         start.bat kopiert
)

if exist "%SCRIPT_DIR%VERSION" (
    copy /Y "%SCRIPT_DIR%VERSION" "%INSTALL_DIR%\VERSION" >nul
)

echo.

:: ─────────────────────────────────────────────────────────────
:: Schritt 3: Verknuepfungen erstellen
:: ─────────────────────────────────────────────────────────────
echo   [3/5] Verknuepfungen erstellen...

:: Desktop-Verknuepfung per PowerShell
powershell -NoProfile -ExecutionPolicy Bypass -Command ^
    "$ws = New-Object -ComObject WScript.Shell; " ^
    "$sc = $ws.CreateShortcut([System.IO.Path]::Combine([Environment]::GetFolderPath('Desktop'), 'StreCoin.lnk')); " ^
    "$sc.TargetPath = '%LAUNCHER%'; " ^
    "$sc.WorkingDirectory = '%INSTALL_DIR%'; " ^
    "$sc.Description = 'StreCoin - Dezentrale Blockchain'; " ^
    "$sc.Save()" >nul 2>&1

if %errorlevel% equ 0 (
    echo         Desktop-Verknuepfung erstellt
) else (
    echo         Desktop-Verknuepfung konnte nicht erstellt werden
)

:: Start-Menue Verknuepfung per PowerShell
powershell -NoProfile -ExecutionPolicy Bypass -Command ^
    "$startMenu = [System.IO.Path]::Combine([Environment]::GetFolderPath('StartMenu'), 'Programs', 'StreCoin'); " ^
    "if (-not (Test-Path $startMenu)) { New-Item -ItemType Directory -Path $startMenu -Force | Out-Null }; " ^
    "$ws = New-Object -ComObject WScript.Shell; " ^
    "$sc = $ws.CreateShortcut([System.IO.Path]::Combine($startMenu, 'StreCoin.lnk')); " ^
    "$sc.TargetPath = '%LAUNCHER%'; " ^
    "$sc.WorkingDirectory = '%INSTALL_DIR%'; " ^
    "$sc.Description = 'StreCoin starten'; " ^
    "$sc.Save(); " ^
    "$sc2 = $ws.CreateShortcut([System.IO.Path]::Combine($startMenu, 'StreCoin Dashboard.lnk')); " ^
    "$sc2.TargetPath = 'http://localhost:8080'; " ^
    "$sc2.Description = 'StreCoin Dashboard im Browser oeffnen'; " ^
    "$sc2.Save()" >nul 2>&1

if %errorlevel% equ 0 (
    echo         Start-Menue Eintraege erstellt
) else (
    echo         Start-Menue konnte nicht erstellt werden
)

echo.

:: ─────────────────────────────────────────────────────────────
:: Schritt 4: Uninstaller registrieren + Firewall
:: ─────────────────────────────────────────────────────────────
echo   [4/5] System-Integration...

:: Uninstaller-Script erstellen
(
echo @echo off
echo chcp 65001 ^>nul 2^>^&1
echo title StreCoin Deinstallation
echo echo.
echo echo   StreCoin wird deinstalliert...
echo echo.
echo taskkill /F /IM strecoin.exe ^>nul 2^>^&1
echo timeout /t 2 /nobreak ^>nul
echo.
echo :: Firewall-Regel entfernen
echo netsh advfirewall firewall delete rule name="StreCoin P2P" ^>nul 2^>^&1
echo.
echo :: Registry-Eintrag entfernen
echo reg delete "HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall\StreCoin" /f ^>nul 2^>^&1
echo.
echo :: Verknuepfungen entfernen
echo del "%%USERPROFILE%%\Desktop\StreCoin.lnk" ^>nul 2^>^&1
echo rmdir /s /q "%%APPDATA%%\Microsoft\Windows\Start Menu\Programs\StreCoin" ^>nul 2^>^&1
echo.
echo :: Programm-Dateien entfernen ^(behalte Daten^)
echo del "%%USERPROFILE%%\StreCoin\strecoin.exe" ^>nul 2^>^&1
echo del "%%USERPROFILE%%\StreCoin\start.bat" ^>nul 2^>^&1
echo del "%%USERPROFILE%%\StreCoin\VERSION" ^>nul 2^>^&1
echo.
echo echo.
echo echo   StreCoin wurde deinstalliert.
echo echo   Deine Blockchain-Daten in %%USERPROFILE%%\StreCoin\data wurden NICHT geloescht.
echo echo   Du kannst den Ordner manuell loeschen wenn gewuenscht.
echo echo.
echo pause
) > "%INSTALL_DIR%\uninstall.bat"

:: In Windows "Apps & Features" registrieren (HKCU — kein Admin noetig)
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall\StreCoin" ^
    /v "DisplayName" /t REG_SZ /d "StreCoin v%VER%" /f >nul 2>&1
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall\StreCoin" ^
    /v "DisplayVersion" /t REG_SZ /d "%VER%" /f >nul 2>&1
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall\StreCoin" ^
    /v "Publisher" /t REG_SZ /d "StreCoin" /f >nul 2>&1
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall\StreCoin" ^
    /v "UninstallString" /t REG_SZ /d "%INSTALL_DIR%\uninstall.bat" /f >nul 2>&1
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall\StreCoin" ^
    /v "InstallLocation" /t REG_SZ /d "%INSTALL_DIR%" /f >nul 2>&1
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall\StreCoin" ^
    /v "URLInfoAbout" /t REG_SZ /d "https://strecoin.com" /f >nul 2>&1
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall\StreCoin" ^
    /v "NoModify" /t REG_DWORD /d 1 /f >nul 2>&1
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall\StreCoin" ^
    /v "NoRepair" /t REG_DWORD /d 1 /f >nul 2>&1

echo         In "Apps & Features" registriert
echo         Uninstaller erstellt

:: Firewall-Regel (erfordert Admin — scheitert still ohne)
netsh advfirewall firewall add rule name="StreCoin P2P" dir=in action=allow program="%BINARY%" enable=yes >nul 2>&1
if %errorlevel% equ 0 (
    echo         Firewall-Regel erstellt
) else (
    echo         Firewall-Regel: Manuell erlauben beim ersten Start
)

echo.

:: ─────────────────────────────────────────────────────────────
:: Schritt 5: Starten
:: ─────────────────────────────────────────────────────────────
echo   [5/5] StreCoin starten...
echo.

color 2F
echo   ╔══════════════════════════════════════════════════════════╗
echo   ║                                                          ║
echo   ║   Installation abgeschlossen!                            ║
echo   ║                                                          ║
echo   ║   Installiert in: %USERPROFILE%\StreCoin                 ║
echo   ║   Dashboard:      http://localhost:%PORT%                  ║
echo   ║                                                          ║
echo   ║   Desktop-Verknuepfung: StreCoin                         ║
echo   ║   Deinstallation: Windows Einstellungen ^> Apps            ║
echo   ║                                                          ║
echo   ╚══════════════════════════════════════════════════════════╝
echo.
echo   StreCoin wird gestartet und das Dashboard oeffnet sich
echo   gleich automatisch im Browser...
echo.

:: Browser nach kurzer Verzoegerung oeffnen
start /b cmd /c "timeout /t 4 /nobreak >nul && start http://localhost:%PORT%"

:: StreCoin starten (blockierend)
cd /d "%INSTALL_DIR%"
"%BINARY%" -port %PORT% -data "%DATA_DIR%" -p2p-port 4001

:: Falls beendet
echo.
echo   StreCoin wurde beendet. Zum Neustarten: Desktop-Verknuepfung doppelklicken.
pause
exit /b 0
