@echo off
setlocal EnableExtensions EnableDelayedExpansion
title AetherForge - Pack USB
cd /d "%~dp0"
set "ROOT=%CD%"
set "USB=%ROOT%\usb"

echo.
echo  ================================================================
echo       AetherForge  -  Pack Portable USB
echo  ================================================================
echo.
echo  Assembles a self-contained copy in:  %USB%\
echo  Copy that entire folder to a USB drive - nothing else needed.
echo.

:: ----------------------------------------------------------------
:: 0. Check prerequisites
:: ----------------------------------------------------------------
where go >nul 2>nul
if errorlevel 1 (
    echo   ERROR: Go not found on PATH.
    echo   Install from https://go.dev/dl/ or add it to PATH.
    pause
    exit /b 1
)
where npm >nul 2>nul
if errorlevel 1 (
    echo   WARNING: npm not found. Skipping frontend build.
    set "SKIP_FRONTEND=1"
)

if not exist "%USB%" mkdir "%USB%"

:: ----------------------------------------------------------------
:: 0b. Ensure portable Go toolchain (forge on PCs without system Go)
:: ----------------------------------------------------------------
echo   [0/8] Ensuring Go toolchain...
if not exist "%USB%\toolchain" mkdir "%USB%\toolchain"
if not exist "%USB%\toolchain\pack" mkdir "%USB%\toolchain\pack"
set "GO_PACK=%USB%\toolchain\pack\go1.26.3.windows-amd64.zip"
if not exist "%USB%\toolchain\go\bin\go.exe" (
    if exist "C:\Program Files\Go\bin\go.exe" (
        echo   [0/8] Copying Go from C:\Program Files\Go...
        if exist "%USB%\toolchain\go" rd /s /q "%USB%\toolchain\go"
        robocopy "C:\Program Files\Go" "%USB%\toolchain\go" /E /NFL /NDL /NJH /NJS /NC /NS >nul
    )
)
if not exist "%GO_PACK%" (
    if exist "%ROOT%\usb\toolchain\pack\go1.26.3.windows-amd64.zip" (
        copy /y "%ROOT%\usb\toolchain\pack\go1.26.3.windows-amd64.zip" "%GO_PACK%" >nul
        echo   [0/8] Offline Go zip copied from existing usb pack.
    ) else (
        echo   [0/8] Downloading offline Go zip for amd64...
        powershell -NoProfile -Command "& { [Net.ServicePointManager]::SecurityProtocol=[Net.SecurityProtocolType]::Tls12; Invoke-WebRequest -Uri 'https://go.dev/dl/go1.26.3.windows-amd64.zip' -OutFile '%GO_PACK%' }"
    )
)
if exist "%USB%\toolchain\go\bin\go.exe" (
    echo   [0/8] Go toolchain ready in usb\toolchain\go\
) else (
    echo   [0/8] WARNING: Go not bundled - LAUNCH.bat will extract from pack zip on first run.
)

:: ----------------------------------------------------------------
:: 1. Build the frontend when npm is available
:: ----------------------------------------------------------------
if not defined SKIP_FRONTEND (
    echo   [1/8] Building frontend...
    cd "%ROOT%\server\web"
    call npm install --silent
    call npm run build
    if errorlevel 1 (
        echo   ERROR: Frontend build failed.
        cd "%ROOT%"
        pause
        exit /b 1
    )
    cd "%ROOT%"
    echo   [1/8] Frontend built.
) else (
    echo   [1/8] Skipped - npm not found.
)

:: ----------------------------------------------------------------
:: 2. Build AetherForge.exe for Windows amd64
:: ----------------------------------------------------------------
echo   [2/8] Compiling AetherForge.exe...
cd "%ROOT%\server"
set "CGO_ENABLED=0"
set "GOOS=windows"
set "GOARCH=amd64"
go build -ldflags="-s -w" -o "%USB%\AetherForge.exe" .
if errorlevel 1 (
    echo   ERROR: Go build failed.
    cd "%ROOT%"
    pause
    exit /b 1
)
cd "%ROOT%"
echo   [2/8] AetherForge.exe ready.

:: ----------------------------------------------------------------
:: 3. Copy webroot - dashboard UI
:: ----------------------------------------------------------------
echo   [3/8] Copying webroot...
if exist "%USB%\webroot" rd /s /q "%USB%\webroot"
if exist "%ROOT%\server\web\dist" (
    xcopy /e /i /q "%ROOT%\server\web\dist" "%USB%\webroot" >nul
) else if exist "%ROOT%\server\webroot" (
    xcopy /e /i /q "%ROOT%\server\webroot" "%USB%\webroot" >nul
) else (
    echo   ERROR: No webroot found. Run npm run build in server\web first.
    pause
    exit /b 1
)
echo   [3/8] webroot copied.

:: ----------------------------------------------------------------
:: 4. Copy agent and fusion source - Forge needs these at runtime
:: ----------------------------------------------------------------
echo   [4/8] Copying agent + fusion source...
if exist "%USB%\agent"  rd /s /q "%USB%\agent"
if exist "%USB%\fusion" rd /s /q "%USB%\fusion"
robocopy "%ROOT%\agent"  "%USB%\agent"  /E /XD node_modules dist .git /XF crypto-miner-agent crypto-miner-fusion /NFL /NDL /NJH /NJS /NC /NS >nul
if errorlevel 8 (
    echo   ERROR: Failed to copy agent source.
    pause
    exit /b 1
)
robocopy "%ROOT%\fusion" "%USB%\fusion" /E /XD node_modules dist .git /XF crypto-miner-fusion /NFL /NDL /NJH /NJS /NC /NS >nul
if errorlevel 8 (
    echo   ERROR: Failed to copy fusion source.
    pause
    exit /b 1
)
echo   [4/8] Source trees copied.

:: ----------------------------------------------------------------
:: 5. Launcher + docs (always sync from project root)
:: ----------------------------------------------------------------
echo   [5/8] Syncing LAUNCH.bat and README...
copy /y "%ROOT%\LAUNCH.bat" "%USB%\LAUNCH.bat" >nul
if not exist "%USB%\README.txt" (
    if exist "%ROOT%\usb\README.txt" copy /y "%ROOT%\usb\README.txt" "%USB%\README.txt" >nul
)
:: run.bat is a project-root marker used by some tooling
echo @echo off > "%USB%\run.bat"
echo rem AetherForge portable root marker >> "%USB%\run.bat"
echo   [5/8] Launcher synced.

:: ----------------------------------------------------------------
:: 6. Remove stale nested server mirror (not needed for portable)
:: ----------------------------------------------------------------
echo   [6/8] Cleaning stale artifacts...
if exist "%USB%\server" rd /s /q "%USB%\server"
echo   [6/8] Done.

:: ----------------------------------------------------------------
:: 7. Ensure data directories exist - preserve existing config and db
:: ----------------------------------------------------------------
echo   [7/8] Ensuring data directories...
if not exist "%USB%\data"               mkdir "%USB%\data"
if not exist "%USB%\data\builds"        mkdir "%USB%\data\builds"
if not exist "%USB%\data\logs"          mkdir "%USB%\data\logs"
if not exist "%USB%\data\blueprints"    mkdir "%USB%\data\blueprints"
if not exist "%USB%\data\preps"         mkdir "%USB%\data\preps"
if not exist "%USB%\data\spread-kits"   mkdir "%USB%\data\spread-kits"
if not exist "%USB%\data\uploads"       mkdir "%USB%\data\uploads"
if not exist "%USB%\data\config.json" (
    echo   [7/8] Writing starter config.json...
    powershell -NoProfile -Command ^
      "$j = @{ port = 8989; data_dir = 'data'; pool = @{ host = 'pool.supportxmr.com'; port = 443; use_tls = $true; password = 'x'; backup_pools = @(@{ host = 'gulf.moneroocean.stream'; port = 20128; use_tls = $true }, @{ host = 'xmr.herominers.com'; port = 1120; use_tls = $true }) }; wallet = @{ address = ''; payment_id = '' }; server = @{ public_url = ''; open_firewall_on_start = $true } }; $j | ConvertTo-Json -Depth 6 | Set-Content -LiteralPath '%USB%\data\config.json' -Encoding utf8"
    echo   [7/8] Starter config.json created ^(empty wallet, TLS pool presets^).
) else (
    echo   [7/8] data\ ready - existing config and db preserved.
)

:: ----------------------------------------------------------------
:: Summary
:: ----------------------------------------------------------------
echo.
echo  ================================================================
echo   USB pack complete!
echo.
echo   Folder:  %USB%\
echo.
dir /b "%USB%"
echo.
echo   To use:
echo     1. Copy the entire usb\ folder to your USB drive
echo     2. Double-click LAUNCH.bat on any Windows PC
echo     3. Open http://localhost:8989
echo.
echo   Your data\ and toolchain\ folders are preserved across repacks.
echo   Go is bundled in toolchain\go\ (offline zip in toolchain\pack\).
echo   First launch without bundled Go: LAUNCH.bat extracts from pack zip.
echo  ================================================================
echo.

pause
endlocal
