@echo off
setlocal EnableExtensions DisableDelayedExpansion

:: E-DA Srl - Configurazione RustDesk per Windows 7
:: PRESUPPOSTO: il client RustDesk e' GIA' stato installato a mano.
:: Questo script NON scarica e NON installa: configura il server E-DA e registra
:: il client nel pannello. NON imposta la password permanente (va configurata a
:: mano dal client, se serve): il client accetta sia la password temporanea che
:: quella permanente (use-both-passwords).
:: La registrazione usa HTTP + WinHttp.WinHttpRequest (compatibile PowerShell 2.0
:: di Windows 7, dove Invoke-WebRequest e TLS 1.2 non sono disponibili).
:: NB lato server: /api/register deve essere raggiungibile via HTTP (porta 80).

:: Auto-elevazione a Amministratore
net session >nul 2>&1
if %errorlevel% neq 0 (
    echo Avvio con privilegi di amministratore...
    powershell -Command "Start-Process -FilePath '%~f0' -Verb RunAs"
    exit /b
)

set "SERVER=rustdesk.eda.it"
set "KEY=Z6bDmiCUSeI6T5HdF0+pfbDQEaU03lTN1PKA6eCIVTc="
set "REGTOKEN=TOKEN_SEGRETO_EDA_RUSTDESK"

echo.
echo  ================================================
echo    E-DA Srl - Configurazione RustDesk (Windows 7)
echo  ================================================
echo.

:: --- 0. Nome di registrazione ---
set "REGNAME="
set /p "REGNAME=  Nome con cui registrare il client [invio = %COMPUTERNAME%]: "
if not defined REGNAME set "REGNAME=%COMPUTERNAME%"
setlocal EnableDelayedExpansion
echo  Nome client: !REGNAME!
endlocal
echo.

:: --- 1. Scrittura configurazione ---
echo  [1/2] Configurazione server E-DA...
:: Ferma il servizio in modo PULITO (lascia che lo SCM termini il processo).
powershell -NoProfile -ExecutionPolicy Bypass -Command "Get-Service | Where-Object {$_.Name -like '*rustdesk*' -or $_.DisplayName -like '*rustdesk*'} | ForEach-Object { try { Stop-Service $_ -Force -ErrorAction Stop } catch {} }"
:: Attende che il servizio sia davvero fermo PRIMA del taskkill, cosi' il kill
:: colpisce solo eventuale GUI/tray stantia e non confonde lo SCM forzando il
:: processo del servizio.
timeout /t 3 /nobreak >nul
:: Chiude la GUI/tray rimasta: se resta aperta con la vecchia config in memoria
:: riscrive RustDesk2.toml alla chiusura, cancellando server e key.
taskkill /F /IM rustdesk.exe >nul 2>&1
timeout /t 2 /nobreak >nul

set "CFG=%APPDATA%\RustDesk\config"
if not exist "%CFG%" mkdir "%CFG%" >nul 2>&1
(
echo rendezvous_server = '%SERVER%'
echo nat_type = 1
echo serial = 0
echo.
echo [options]
echo custom-rendezvous-server = '%SERVER%'
echo key = '%KEY%'
echo api-server = ''
echo verification-method = 'use-both-passwords'
echo approve-mode = 'password'
) > "%CFG%\RustDesk2.toml"

set "SVCCFG=C:\Windows\ServiceProfiles\LocalService\AppData\Roaming\RustDesk\config"
if not exist "%SVCCFG%" mkdir "%SVCCFG%" >nul 2>&1
(
echo rendezvous_server = '%SERVER%'
echo nat_type = 1
echo serial = 0
echo.
echo [options]
echo custom-rendezvous-server = '%SERVER%'
echo key = '%KEY%'
echo api-server = ''
echo verification-method = 'use-both-passwords'
echo approve-mode = 'password'
) > "%SVCCFG%\RustDesk2.toml" 2>nul

echo  Server configurato: %SERVER%

:: --- 2. Registrazione nel database E-DA (HTTP, Win7-compatibile) ---
echo  [2/2] Registrazione nel database E-DA...

:: Individua l'eseguibile (non richiede il servizio attivo).
set "RDEXE="
set "FINDTRIES=0"
:FIND_EXE_RETRY
set /a FINDTRIES+=1
if exist "%ProgramFiles%\RustDesk\rustdesk.exe"        set "RDEXE=%ProgramFiles%\RustDesk\rustdesk.exe"
if not defined RDEXE if exist "%ProgramFiles(x86)%\RustDesk\rustdesk.exe" set "RDEXE=%ProgramFiles(x86)%\RustDesk\rustdesk.exe"
if not defined RDEXE if exist "%LocalAppData%\Programs\RustDesk\rustdesk.exe" set "RDEXE=%LocalAppData%\Programs\RustDesk\rustdesk.exe"
if not defined RDEXE for /f "delims=" %%i in ('where rustdesk 2^>nul') do set "RDEXE=%%i"
if not defined RDEXE (
    if %FINDTRIES% lss 8 (
        timeout /t 3 /nobreak >nul
        goto FIND_EXE_RETRY
    )
)
if not defined RDEXE (
    echo  ATTENZIONE: rustdesk.exe non trovato. Verificare che RustDesk sia installato.
    goto SKIP_REG
)

:: Riavvia il servizio (fermato al passo 1) e ATTENDE che sia davvero 'Running'
:: prima di leggere l'ID.
echo  Avvio servizio...
powershell -NoProfile -ExecutionPolicy Bypass -Command "Get-Service | Where-Object {$_.Name -like '*rustdesk*' -or $_.DisplayName -like '*rustdesk*'} | ForEach-Object { try { Start-Service $_ -ErrorAction Stop } catch {} }"
echo  Attendo che il servizio sia attivo...
powershell -NoProfile -ExecutionPolicy Bypass -Command "$n=0; while($n -lt 25){ $s=Get-Service | Where-Object {$_.Name -like '*rustdesk*' -or $_.DisplayName -like '*rustdesk*'} | Select-Object -First 1; if($s -and $s.Status -eq 'Running'){break}; Start-Sleep -Seconds 1; $n++ }"

set "RDID="
set "RDTRIES=0"
:GET_ID_RETRY
set /a RDTRIES+=1
for /f "delims=" %%i in ('"%RDEXE%" --get-id 2^>nul') do set "RDID=%%i"
if not defined RDID (
    if %RDTRIES% lss 6 (
        timeout /t 3 /nobreak >nul
        goto GET_ID_RETRY
    )
    echo  ID non disponibile, registrazione saltata.
    goto SKIP_REG
)

setlocal EnableDelayedExpansion
echo  PC: !REGNAME! — ID: %RDID%
endlocal

:: Valori passati via variabili d'ambiente (REGNAME, RDID, REGTOKEN); il JSON
:: viene costruito in PowerShell usando [char]34 per le virgolette, cosi' non ci
:: sono virgolette letterali nella riga di comando (niente problemi di quoting cmd).
set "RDID=%RDID%"
powershell -NoProfile -ExecutionPolicy Bypass -Command ^
  "$q=[char]34;" ^
  "$en=($env:REGNAME -replace '\\','\\') -replace ([char]34),('\'+[char]34);" ^
  "$ei=($env:RDID -replace '\\','\\') -replace ([char]34),('\'+[char]34);" ^
  "$body='{'+$q+'name'+$q+':'+$q+$en+$q+','+$q+'rustDeskId'+$q+':'+$q+$ei+$q+'}';" ^
  "try {" ^
  "  $w=New-Object -ComObject WinHttp.WinHttpRequest.5.1;" ^
  "  $w.SetTimeouts(0,30000,30000,60000);" ^
  "  $w.Open('POST','http://rustdesk.eda.it/api/register',$false);" ^
  "  $w.SetRequestHeader('X-Register-Token',$env:REGTOKEN);" ^
  "  $w.SetRequestHeader('Content-Type','application/json');" ^
  "  $w.Send($body);" ^
  "  if ($w.Status -eq 200 -or $w.Status -eq 201) { Write-Host ('  Registrato OK (HTTP ' + $w.Status + ')') } else { Write-Host ('  Risposta server: HTTP ' + $w.Status + ' ' + $w.ResponseText) }" ^
  "} catch { Write-Host ('  ERRORE registrazione: ' + $_.Exception.Message) }"

:SKIP_REG

:: --- Fine ---
echo.
echo  ================================================
echo    Configurazione completata!
echo  ================================================
echo.

:: Forza l'avvio automatico del servizio (cosi' riparte dopo ogni riavvio) e si
:: assicura che sia attivo ora.
powershell -NoProfile -ExecutionPolicy Bypass -Command "Get-Service | Where-Object {$_.Name -like '*rustdesk*' -or $_.DisplayName -like '*rustdesk*'} | ForEach-Object { & sc.exe config $_.Name start= auto | Out-Null; try { if ($_.Status -ne 'Running') { Start-Service $_.Name -ErrorAction Stop } } catch {} }"

setlocal EnableDelayedExpansion
echo  Nome client: !REGNAME!
endlocal
echo  ID RustDesk: %RDID%
echo.
echo  La password permanente NON viene impostata da questo script:
echo  va configurata manualmente dal client RustDesk (Sicurezza).
echo  Sono attive sia la password temporanea che quella permanente.
echo.
pause
