@echo off
chcp 65001 >nul
title Nebula Game Updater v1.0

:: =============================================
:: NEBULA GAME UPDATER
:: =============================================
:: Parametry:
::   %1 - game_id
::   %2 - install_dir
::   %3 - temp_dir
::   %4 - new_version
:: =============================================

setlocal enabledelayedexpansion

:: KOLORY
set "GREEN=[92m"
set "YELLOW=[93m"
set "RED=[91m"
set "BLUE=[94m"
set "CYAN=[96m"
set "WHITE=[97m"
set "RESET=[0m"

:: =============================================
:: KONFIGURACJA
:: =============================================
set "API_URL=https://launcher.server-api.dedyn.io"
set "GAME_ID=%~1"
set "INSTALL_DIR=%~2"
set "TEMP_DIR=%~3"
set "NEW_VERSION=%~4"

:: =============================================
:: NAGŁÓWEK
:: =============================================
cls
echo %CYAN%╔══════════════════════════════════════════════════════════╗%RESET%
echo %CYAN%║                                                          ║%RESET%
echo %CYAN%║           🌌 NEBULA GAME UPDATER v1.0                  ║%RESET%
echo %CYAN%║                                                          ║%RESET%
echo %CYAN%╚══════════════════════════════════════════════════════════╝%RESET%
echo.
echo %WHITE%📦 Gra: %GREEN%%GAME_ID%%RESET%
echo %WHITE%📂 Instalacja: %YELLOW%%INSTALL_DIR%%RESET%
echo %WHITE%📁 Tymczasowe: %YELLOW%%TEMP_DIR%%RESET%
echo %WHITE%🔢 Nowa wersja: %GREEN%%NEW_VERSION%%RESET%
echo.
echo %BLUE%━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━%RESET%
echo.

:: =============================================
:: SPRAWDZANIE POŁĄCZENIA
:: =============================================
echo %YELLOW%🔍 Sprawdzanie połączenia z serwerem...%RESET%

ping -n 1 launcher.server-api.dedyn.io >nul 2>&1
if errorlevel 1 (
    echo %RED%❌ Brak połączenia z serwerem!%RESET%
    echo.
    echo %YELLOW%⏳ Próba ponowna za 5 sekund...%RESET%
    timeout /t 5 /nobreak >nul
    ping -n 1 launcher.server-api.dedyn.io >nul 2>&1
    if errorlevel 1 (
        echo %RED%❌ Nadal brak połączenia. Sprawdź internet.%RESET%
        pause
        exit /b 1
    )
)

echo %GREEN%✅ Połączenie OK%RESET%
echo.

:: =============================================
:: KROK 1: POBIERANIE SYS_Game.json
:: =============================================
echo %YELLOW%📥 Krok 1/5: Pobieranie SYS_Game.json...%RESET%

set "SYS_GAME_URL=%API_URL%/api/games/sys-game"
set "SYS_GAME_FILE=%TEMP_DIR%\SYS_Game.json"

echo %WHITE%   URL: %SYS_GAME_URL%%RESET%
echo %WHITE%   Plik: %SYS_GAME_FILE%%RESET%

powershell -Command "& {
    try {
        $ProgressPreference = 'SilentlyContinue'
        Invoke-WebRequest -Uri '%SYS_GAME_URL%' -OutFile '%SYS_GAME_FILE%' -UseBasicParsing -TimeoutSec 10
        exit 0
    } catch {
        Write-Error $_.Exception.Message
        exit 1
    }
}"

if errorlevel 1 (
    echo %RED%❌ Błąd pobierania SYS_Game.json%RESET%
    pause
    exit /b 1
)

:: Sprawdź czy plik istnieje
if not exist "%SYS_GAME_FILE%" (
    echo %RED%❌ Plik SYS_Game.json nie został pobrany%RESET%
    pause
    exit /b 1
)

:: Sprawdź rozmiar pliku
for %%A in ("%SYS_GAME_FILE%") do set "SYS_SIZE=%%~zA"
if %SYS_SIZE% LSS 10 (
    echo %RED%❌ SYS_Game.json jest pusty lub uszkodzony (%SYS_SIZE% B)%RESET%
    pause
    exit /b 1
)

echo %GREEN%✅ SYS_Game.json pobrany (%SYS_SIZE% B)%RESET%
echo.

:: =============================================
:: KROK 2: PARSOWANIE SYS_Game.json
:: =============================================
echo %YELLOW%📊 Krok 2/5: Parsowanie danych gry...%RESET%

:: Użyj PowerShell do parsowania JSON
powershell -Command "& {
    $json = Get-Content '%SYS_GAME_FILE%' -Raw | ConvertFrom-Json
    $game = $json.games.'%GAME_ID%'
    
    if ($game) {
        $game.downloadUrl
        $game.size_mb
        $game.version
        $game.checksum
        $game.game_name
    } else {
        Write-Error 'Nie znaleziono gry'
        exit 1
    }
}" > "%TEMP_DIR%\game_data.txt" 2>&1

:: Odczytaj dane
set /p DOWNLOAD_URL=<"%TEMP_DIR%\game_data.txt"
set /p SIZE_MB=<"%TEMP_DIR%\game_data.txt"
set /p SERVER_VERSION=<"%TEMP_DIR%\game_data.txt"
set /p CHECKSUM=<"%TEMP_DIR%\game_data.txt"
set /p GAME_NAME=<"%TEMP_DIR%\game_data.txt"

if "%DOWNLOAD_URL%"=="" (
    echo %RED%❌ Nie znaleziono danych dla gry %GAME_ID%%RESET%
    echo %YELLOW%   Sprawdź czy gra istnieje w SYS_Game.json%RESET%
    pause
    exit /b 1
)

echo %WHITE%   Nazwa: %GREEN%%GAME_NAME%%RESET%
echo %WHITE%   Rozmiar: %YELLOW%%SIZE_MB% MB%RESET%
echo %WHITE%   Wersja: %CYAN%%SERVER_VERSION%%RESET%
echo %WHITE%   URL: %BLUE%%DOWNLOAD_URL%%RESET%
echo.

:: =============================================
:: KROK 3: POBIERANIE PLIKU GRY
:: =============================================
echo %YELLOW%📥 Krok 3/5: Pobieranie pliku gry...%RESET%

set "GAME_ZIP=%TEMP_DIR%\%GAME_ID%.zip"

:: Użyj curl lub powershell do pobierania z progresem
echo %WHITE%   Plik: %GAME_ZIP%%RESET%
echo %WHITE%   Rozmiar: %SIZE_MB% MB%RESET%
echo.

:: Próba z curl (często szybszy)
where curl >nul 2>&1
if not errorlevel 1 (
    echo %WHITE%   Używam curl do pobierania...%RESET%
    curl -L -o "%GAME_ZIP%" "%DOWNLOAD_URL%" --progress-bar
    if errorlevel 1 (
        echo %RED%❌ Błąd curl - próba z PowerShell%RESET%
        goto :use_powershell
    )
    goto :check_download
)

:use_powershell
echo %WHITE%   Używam PowerShell do pobierania...%RESET%
powershell -Command "& {
    $ProgressPreference = 'Continue'
    Write-Host '   Pobieranie: %DOWNLOAD_URL%' -ForegroundColor Yellow
    Invoke-WebRequest -Uri '%DOWNLOAD_URL%' -OutFile '%GAME_ZIP%' -UseBasicParsing
    exit 0
}"

:check_download
if errorlevel 1 (
    echo %RED%❌ Błąd pobierania pliku gry%RESET%
    pause
    exit /b 1
)

if not exist "%GAME_ZIP%" (
    echo %RED%❌ Plik gry nie został pobrany%RESET%
    pause
    exit /b 1
)

:: Sprawdź rozmiar
for %%A in ("%GAME_ZIP%") do set "ZIP_SIZE=%%~zA"
set /a ZIP_SIZE_MB=%ZIP_SIZE% / 1048576

echo %GREEN%✅ Plik pobrany (%ZIP_SIZE_MB% MB)%RESET%
echo.

:: =============================================
:: KROK 4: WERYFIKACJA CHECKSUM
:: =============================================
if not "%CHECKSUM%"=="" (
    echo %YELLOW%🔍 Krok 4/5: Weryfikacja checksum...%RESET%
    
    :: Oblicz MD5 pliku
    powershell -Command "& {
        $hash = Get-FileHash -Path '%GAME_ZIP%' -Algorithm MD5
        $hash.Hash.ToLower()
    }" > "%TEMP_DIR%\checksum.txt"
    
    set /p ACTUAL_CHECKSUM=<"%TEMP_DIR%\checksum.txt"
    
    echo %WHITE%   Oczekiwany: %CYAN%%CHECKSUM%%RESET%
    echo %WHITE%   Otrzymany: %CYAN%%ACTUAL_CHECKSUM%%RESET%
    
    if "%ACTUAL_CHECKSUM%"=="%CHECKSUM%" (
        echo %GREEN%✅ Checksum zgodny!%RESET%
    ) else (
        echo %RED%❌ Błąd checksum! Plik uszkodzony.%RESET%
        echo %YELLOW%   Pobieranie ponowne...%RESET%
        del "%GAME_ZIP%" 2>nul
        timeout /t 2 /nobreak >nul
        goto :use_powershell
    )
    echo.
)

:: =============================================
:: KROK 5: ROZPAKOWYWANIE
:: =============================================
echo %YELLOW%📦 Krok 5/5: Rozpakowywanie gry...%RESET%

:: Tworzenie katalogu instalacji
if not exist "%INSTALL_DIR%" mkdir "%INSTALL_DIR%"

:: Użyj PowerShell do rozpakowania
powershell -Command "& {
    Add-Type -AssemblyName System.IO.Compression.FileSystem
    Write-Host '   Rozpakowywanie: %GAME_ZIP%' -ForegroundColor Yellow
    Write-Host '   Do: %INSTALL_DIR%' -ForegroundColor Yellow
    
    try {
        [System.IO.Compression.ZipFile]::ExtractToDirectory('%GAME_ZIP%', '%INSTALL_DIR%', $true)
        Write-Host '   ✅ Rozpakowano!' -ForegroundColor Green
        exit 0
    } catch {
        Write-Host ('   ❌ Błąd: ' + $_.Exception.Message) -ForegroundColor Red
        exit 1
    }
}"

if errorlevel 1 (
    echo %RED%❌ Błąd rozpakowywania%RESET%
    pause
    exit /b 1
)

echo %GREEN%✅ Gra rozpakowana%RESET%
echo.

:: =============================================
:: SPRZĄTANIE
:: =============================================
echo %YELLOW%🧹 Czyszczenie plików tymczasowych...%RESET%

:: Usuń plik ZIP
if exist "%GAME_ZIP%" del "%GAME_ZIP%" 2>nul

:: Usuń SYS_Game.json
if exist "%SYS_GAME_FILE%" del "%SYS_GAME_FILE%" 2>nul

:: Usuń pliki tymczasowe
if exist "%TEMP_DIR%\game_data.txt" del "%TEMP_DIR%\game_data.txt" 2>nul
if exist "%TEMP_DIR%\checksum.txt" del "%TEMP_DIR%\checksum.txt" 2>nul

echo %GREEN%✅ Czyszczenie zakończone%RESET%
echo.

:: =============================================
:: ZAKOŃCZENIE
:: =============================================
echo %CYAN%╔══════════════════════════════════════════════════════════╗%RESET%
echo %CYAN%║                                                          ║%RESET%
echo %CYAN%║              ✅ AKTUALIZACJA ZAKOŃCZONA!                ║%RESET%
echo %CYAN%║                                                          ║%RESET%
echo %CYAN%╚══════════════════════════════════════════════════════════╝%RESET%
echo.
echo %GREEN%📦 Gra: %GAME_NAME% (%GAME_ID%)%RESET%
echo %GREEN%🔢 Wersja: %NEW_VERSION%%RESET%
echo %GREEN%📂 Instalacja: %INSTALL_DIR%%RESET%
echo.

:: =============================================
:: POWIADOMIENIE SERWERA
:: =============================================
echo %YELLOW%📤 Powiadamianie serwera o zakończeniu...%RESET%

powershell -Command "& {
    try {
        $body = @{
            gameId = '%GAME_ID%'
            version = '%NEW_VERSION%'
            status = 'success'
            timestamp = (Get-Date).ToString('o')
        } | ConvertTo-Json
        
        Invoke-WebRequest -Uri '%API_URL%/api/games/update-status' -Method Post -Body $body -ContentType 'application/json' -UseBasicParsing -TimeoutSec 5
        exit 0
    } catch {
        exit 1
    }
}"

echo %GREEN%✅ Powiadomienie wysłane%RESET%
echo.

echo %WHITE%Naciśnij dowolny klawisz aby zamknąć...%RESET%
pause >nul
exit /b 0
