@echo off
:: ============================================
:: SETUP REMOTE ACCESS - Lab UNNES (AUTO-REGISTER)
:: Jalankan sebagai ADMINISTRATOR
:: ============================================

echo ============================================
echo   SETUP REMOTE ACCESS - LAB UNNES
echo   Auto-Register to VPS
echo ============================================
echo.

:: Check admin
net session >nul 2>&1
if %errorlevel% neq 0 (
    echo [ERROR] Jalankan sebagai ADMINISTRATOR!
    echo Klik kanan ^> Run as administrator
    pause
    exit /b 1
)

:: Config
set "VPS_HOST=lab.hiii.my.id"
set "REGISTER_URL=https://%VPS_HOST%/api/pc/register"
set "REGISTER_TOKEN=fc7e31ddf4a401b6def38aa7e50ac024"

:: Get PC info
for /f "tokens=2 delims==" %%a in ('wmic computersystem get name /value 2^>nul') do set "PC_NAME=%%a"
for /f "tokens=2 delims={}" %%a in ('powershell -Command "(Get-NetIPAddress -AddressFamily IPv4 ^| Where-Object {$_.IPAddress -like '10.1.*'}).IPAddress"') do set "LOCAL_IP=%%a"

echo [INFO]  PC Name: %PC_NAME%
echo [INFO]  IP Lokal: %LOCAL_IP%
echo.

:: STEP 1: Install OpenSSH Server
echo [STEP 1] Checking OpenSSH Server...
powershell -Command "Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH.Server*'" | findstr /i "Installed" >nul 2>&1
if %errorlevel% equ 0 (
    echo [OK]    OpenSSH Server sudah terinstall.
) else (
    echo [INFO]  OpenSSH Server belum terinstall, mencoba install...
    powershell -Command "Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0" 2>&1
    if %errorlevel% neq 0 (
        echo [WARN]  Install gagal, tapi lanjutkan jika sudah terinstall manual.
    )
)

sc config sshd start=auto >nul 2>&1
net start sshd >nul 2>&1
netsh advfirewall firewall add rule name="OpenSSH Server" dir=in action=allow protocol=tcp localport=22 >nul 2>&1
echo [OK]    SSH service aktif + firewall rule.

:: STEP 2: Generate SSH Key
echo.
echo [STEP 2] Generating SSH key...
if not exist "%USERPROFILE%\.ssh" mkdir "%USERPROFILE%\.ssh"
if exist "%USERPROFILE%\.ssh\id_ed25519" (
    echo [OK]    SSH key sudah ada.
) else (
    ssh-keygen -t ed25519 -f "%USERPROFILE%\.ssh\id_ed25519" -N "" -C "lab-%PC_NAME%" >nul 2>&1
    echo [OK]    SSH key generated.
)

:: STEP 3: Auto-Register to VPS
echo.
echo [STEP 3] Registering to VPS...

:: Read public key
set "PUB_KEY_FILE=%USERPROFILE%\.ssh\id_ed25519.pub"
set "PUB_KEY="
for /f "usebackq delims=" %%a in ("%PUB_KEY_FILE%") do set "PUB_KEY=%%a"

:: Create JSON payload
set "JSON_FILE=%TEMP%\register.json"
(
echo {"pc_name":"%PC_NAME%","token":"%REGISTER_TOKEN%","ip":"%LOCAL_IP%","public_key":"%PUB_KEY%"}
) > "%JSON_FILE%"

:: POST to VPS API via PowerShell (more reliable than curl on Windows)
powershell -Command ^
    "$json = Get-Content '%JSON_FILE%' -Raw; ^
     try { ^
        $resp = Invoke-RestMethod -Uri '%REGISTER_URL%' -Method POST -ContentType 'application/json; charset=utf-8' -Body ([System.Text.Encoding]::UTF8.GetBytes($json)) -TimeoutSec 15; ^
        Write-Host '[OK]    Register response:' $resp.status; ^
        Write-Host '       Port:' $resp.port; ^
        Write-Host '       ' $resp.message; ^
     } catch { ^
        Write-Host '[ERROR] Register failed:' $_.Exception.Message; ^
     }"

if %errorlevel% neq 0 (
    echo [WARN]  Register via PowerShell gagal, mencoba curl...
    curl -sk -X POST "%REGISTER_URL%" -H "Content-Type: application/json" -d @%JSON_FILE%
)

:: STEP 4: Setup Reverse Tunnel
echo.
echo [STEP 4] Setting up reverse tunnel...

for /f "tokens=4 delims=." %%a in ("%LOCAL_IP%") do set "LAST_OCTET=%%a"
set /a "TUNNEL_PORT=22000 + %LAST_OCTET%"
echo [INFO]  Tunnel port: %TUNNEL_PORT%

:: Create tunnel script (hidden window)
set "TUNNEL_SCRIPT=%USERPROFILE%\tunnel.bat"
(
echo @echo off
echo :loop
echo ssh -N -o ServerAliveInterval=60 -o ServerAliveCountMax=3 -o StrictHostKeyChecking=no -i "%%USERPROFILE%%\.ssh\id_ed25519" -R %TUNNEL_PORT%%:localhost:22 root@%VPS_HOST%
echo timeout /t 10 /nobreak
echo goto loop
) > "%TUNNEL_SCRIPT%"

:: Create VBS wrapper for hidden window
set "TUNNEL_VBS=%USERPROFILE%\tunnel_hidden.vbs"
(
echo Set WshShell = CreateObject("WScript.Shell")
echo WshShell.Run """%TUNNEL_SCRIPT%""", 0, False
) > "%TUNNEL_VBS%"

:: Add to startup
set "STARTUP_DIR=%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup"
copy "%TUNNEL_VBS%" "%STARTUP_DIR%\RemoteAccess.vbs" >nul 2>&1

:: Also create scheduled task
schtasks /create /tn "RemoteAccessTunnel" /tr "\"%TUNNEL_VBS%\"" /sc onstart /rl highest /f >nul 2>&1
echo [OK]    Auto-start configured.

:: STEP 5: Start tunnel now
echo.
echo [STEP 5] Starting tunnel...
start "" "%TUNNEL_VBS%"
timeout /t 3 /nobreak >nul

:: Verify tunnel
echo [INFO]  Verifying tunnel connection...
powershell -Command ^
    "try { ^
        $tcp = New-Object System.Net.Sockets.TcpClient; ^
        $tcp.Connect('localhost', %TUNNEL_PORT%); ^
        Write-Host '[OK]    Tunnel port' %TUNNEL_PORT% 'is listening!'; ^
        $tcp.Close(); ^
     } catch { ^
        Write-Host '[WARN]  Tunnel port not yet active (will auto-reconnect)'; ^
     }"

:: DONE
echo.
echo ============================================
echo   SETUP SELESAI!
echo ============================================
echo.
echo PC Name:     %PC_NAME%
echo IP Lokal:    %LOCAL_IP%
echo Tunnel Port: %TUNNEL_PORT%
echo.
echo Tunnel akan otomatis konek saat PC hidup.
echo Bapak bisa cek status di:
echo https://lab.hiii.my.id/lab-monitor.html
echo.
echo ============================================
pause
