@echo off
rem ===================================================================
rem  installa_piattaforma.cmd - installer di Sublima e Zero per Windows
rem  Part of Sublima. See LICENSE file for full copyright and licensing
rem  details.
rem ===================================================================
rem
rem  Perche' esiste:
rem    E' l'unico file da scaricare dal sito. Su una macchina vergine non
rem    c'e' Python, quindi il vero installer (che e' scritto in Python)
rem    non potrebbe nemmeno partire: questo file si occupa di mettere
rem    Python, poi scarica il vero installer e gli passa la mano.
rem
rem  Perche' un .cmd e non un .vbs:
rem    I .vbs di Sublima (ServerSublima.vbs e simili) esistono per NON far
rem    lampeggiare la finestra nera all'accensione. Qui la finestra la si
rem    vuole: e' un'installazione, il tecnico deve vederla. Del .vbs qui
rem    resterebbero solo gli svantaggi: la regola di Defender che blocca i
rem    VBScript quando lanciano un eseguibile appena scaricato, i domini
rem    che spengono Windows Script Host da criterio di gruppo, e la
rem    dismissione di VBScript annunciata da Microsoft. Un .cmd non e'
rem    toccato da nessuna delle tre, ed e' testo puro come il .vbs.
rem
rem  Uso:
rem    Doppio click. Oppure, da Prompt dei comandi, con le stesse opzioni
rem    del vero installer, che vengono passate cosi' come sono:
rem
rem      installa_piattaforma.cmd --solo-zero
rem      installa_piattaforma.cmd --non-interattivo --ruolo server
rem      installa_piattaforma.cmd --dry-run
rem
rem  NB: solo caratteri ASCII in questo file. Un .cmd con lettere
rem  accentate si legge male o si rompe a seconda della tabella codici
rem  attiva sulla macchina, che cambia da cliente a cliente.
rem ===================================================================

setlocal enableextensions enabledelayedexpansion
title Installazione Sublima
color 07

set "VERSIONE=2026.10"
set "BASE=https://www.sublima.it/pacchetti/windows"
rem  Per collaudare contro il server di sviluppo, senza pubblicare niente
rem  sul sito, basta impostare prima la variabile:
rem      set SUBLIMA_INSTALLER_BASE=http://192.168.1.10:55224/tpl
if defined SUBLIMA_INSTALLER_BASE set "BASE=%SUBLIMA_INSTALLER_BASE%"
set "SETUP=%TEMP%\sublima_setup"
set "LOG=%SETUP%\bootstrap.log"
set "PY_URL=https://www.python.org/ftp/python/3.14.7/python-3.14.7-amd64.exe"
rem  SHA-256 pubblicato da python.org per questo file, verificato scaricandolo.
rem  Copre sia il download troncato su una linea ballerina sia la manomissione.
rem  Va aggiornato insieme a PY_URL a ogni cambio di versione, altrimenti
rem  l'installazione si ferma qui: e' voluto, meglio fermarsi che installare
rem  un binario che non e' quello che ci aspettiamo.
set "PY_SHA=9d9eb2709ef81bf5cd30db3c2096bdbc4ea10087c22e62f27d356b36f6ae9649"
set "PY_DIR=%LOCALAPPDATA%\Programs\Python\Python314"
set "PY="
set "USCITA=0"
rem  La prova a vuoto la capisce anche questa fase: senza, un --dry-run
rem  installerebbe comunque Python, e non sarebbe piu' una prova.
set "PROVA=0"
echo.%* | find /i "--dry-run" >nul 2>&1 && set "PROVA=1"

if not exist "%SETUP%" mkdir "%SETUP%" >nul 2>&1
call :log "=========== avvio installer %VERSIONE% ==========="

echo.
echo   ==================================================================
echo     INSTALLAZIONE DELLA PIATTAFORMA SUBLIMA
echo     versione %VERSIONE%
echo   ==================================================================
echo.
echo   Questo programma prepara il computer e installa Sublima e/o Zero.
echo   Richiede qualche minuto e una connessione a Internet.
echo.

call :controlla_architettura
if errorlevel 1 goto :uscita_errore

call :controlla_curl
if errorlevel 1 goto :uscita_errore

call :controlla_rete
if errorlevel 1 goto :uscita_errore

call :trova_python
if not defined PY if "%PROVA%"=="1" (
    echo.
    echo   PROVA A VUOTO: non installo niente.
    echo   Su questo PC installerei Python da:
    echo     %PY_URL%
    echo   Per vedere il resto del piano serve un Python gia' presente.
    call :log "prova a vuoto: Python assente, mi fermo qui"
    goto :uscita
)
if not defined PY call :installa_python
if not defined PY goto :uscita_errore

call :scarica_installer
if errorlevel 1 goto :uscita_errore

echo.
echo   Avvio l'installazione vera e propria.
echo   ------------------------------------------------------------------
call :log "lancio: %PY% installa_piattaforma.py %*"
"%PY%" "%SETUP%\installa_piattaforma.py" %*
set "USCITA=%ERRORLEVEL%"
call :log "installer terminato con codice %USCITA%"
goto :uscita


rem ------------------------------------------------------------------ rem
rem  Controlli
rem ------------------------------------------------------------------ rem
:controlla_architettura
if /I "%PROCESSOR_ARCHITECTURE%"=="AMD64" exit /b 0
if /I "%PROCESSOR_ARCHITECTURE%"=="ARM64" exit /b 0
if /I "%PROCESSOR_ARCHITEW6432%"=="AMD64" exit /b 0
call :errore "Questo PC risulta a 32 bit. Sublima richiede Windows a 64 bit."
exit /b 1

:controlla_curl
where curl.exe >nul 2>&1
if not errorlevel 1 (
    call :log "curl.exe trovato"
    exit /b 0
)
call :errore "Questa versione di Windows e' troppo vecchia: manca curl.exe" ^
    "Aggiornare Windows, oppure installare Python a mano da python.org e" ^
    "poi lanciare installa_piattaforma.py"
exit /b 1

:controlla_rete
echo   Verifico il collegamento a Internet...
curl -sfI --connect-timeout 20 "%BASE%/azienda.conf" >nul 2>&1
if not errorlevel 1 (
    echo   ...collegamento a www.sublima.it: OK
    call :log "rete OK"
    exit /b 0
)
call :errore "Non riesco a raggiungere www.sublima.it." ^
    "Verificare la connessione o il proxy aziendale, poi rilanciare."
exit /b 1


rem ------------------------------------------------------------------ rem
rem  Python
rem ------------------------------------------------------------------ rem
:trova_python
rem  Si guarda PRIMA nella cartella di installazione standard, poi nel
rem  PATH: subito dopo un'installazione silenziosa il PATH di questo
rem  processo e' ancora quello vecchio, perche' l'aggiornamento va nel
rem  registro e non nei processi gia' avviati.
if exist "%PY_DIR%\python.exe" call :prova_python "%PY_DIR%\python.exe"
if defined PY exit /b 0
for /f "delims=" %%i in ('where python.exe 2^>nul') do (
    if not defined PY call :prova_python "%%i"
)
if defined PY exit /b 0
for /f "delims=" %%i in ('py -3 -c "import sys;print(sys.executable)" 2^>nul') do (
    if not defined PY call :prova_python "%%i"
)
exit /b 0

:prova_python
rem  Accetta l'interprete solo se e' abbastanza recente: il confronto lo fa
rem  Python stesso, il batch non sa confrontare numeri di versione.
"%~1" -c "import sys; sys.exit(0 if sys.version_info >= (3, 10) else 1)" >nul 2>&1
if errorlevel 1 (
    call :log "scartato %~1: troppo vecchio"
    exit /b 0
)
set "PY=%~1"
call :log "Python scelto: %PY%"
echo   Python trovato: %PY%
exit /b 0

:installa_python
echo.
echo   Python non risulta installato: lo installo io.
echo   Sono circa 32 MB, non compariranno finestre.
call :scarica "%PY_URL%" "%SETUP%\python-setup.exe" "Python 3.14"
if errorlevel 1 exit /b 1
call :verifica_impronta "%SETUP%\python-setup.exe" "%PY_SHA%"
if errorlevel 1 exit /b 1
echo   Installo Python (un paio di minuti)...
call :log "avvio setup Python"
rem  InstallAllUsers=0: installazione per l'utente, non chiede privilegi ed
rem  e' coerente con la cartella %USERPROFILE%\sublima e con l'avvio
rem  automatico, che sono anch'essi per utente.
rem  Include_tcltk=1: serve alla finestra dell'installer e a pymsgbox.
"%SETUP%\python-setup.exe" /quiet InstallAllUsers=0 PrependPath=1 ^
    Include_pip=1 Include_tcltk=1 Include_launcher=1
set "RCPY=%ERRORLEVEL%"
call :log "setup Python terminato con codice %RCPY%"
if not "%RCPY%"=="0" if not "%RCPY%"=="3010" (
    call :errore "Installazione di Python fallita (codice %RCPY%)." ^
        "Installarlo a mano da %PY_URL%" ^
        "spuntando 'Add python.exe to PATH' e 'tcl/tk and IDLE'," ^
        "poi rilanciare questo file."
    exit /b 1
)
call :trova_python
if defined PY (
    echo   Python installato: %PY%
    exit /b 0
)
call :errore "Python risulta installato ma non lo trovo in" ^
    "%PY_DIR%" ^
    "Riavviare il PC e rilanciare questo file."
exit /b 1


rem ------------------------------------------------------------------ rem
rem  Il vero installer
rem ------------------------------------------------------------------ rem
:scarica_installer
rem  Si riscarica ogni volta: cosi' una correzione pubblicata sul sito
rem  arriva subito, anche a chi ha ancora in Download una copia vecchia
rem  di questo .cmd.
call :scarica "%BASE%/installa_piattaforma.py" ^
    "%SETUP%\installa_piattaforma.py" "installer"
if errorlevel 1 exit /b 1
rem  La finestra grafica e' un di piu': se non arriva si prosegue in
rem  console, quindi qui un errore non ferma niente.
call :scarica "%BASE%/installa_piattaforma_gui.py" ^
    "%SETUP%\installa_piattaforma_gui.py" "finestra grafica"
exit /b 0


rem ------------------------------------------------------------------ rem
rem  Utilita'
rem ------------------------------------------------------------------ rem
:scarica
rem  %1 url   %2 destinazione   %3 descrizione
echo   Scarico %~3...
call :log "scarico %~1"
curl -L -f -sS --retry 3 --connect-timeout 20 -o "%~2" "%~1"
if errorlevel 1 (
    call :errore "Non sono riuscito a scaricare %~3." ^
        "Indirizzo: %~1" ^
        "Verificare la connessione, poi rilanciare."
    exit /b 1
)
if not exist "%~2" (
    call :errore "Il file %~3 non e' arrivato."
    exit /b 1
)
exit /b 0

:verifica_impronta
rem  %1 file   %2 impronta SHA-256 attesa
set "CALCOLATA="
for /f "skip=1 delims=" %%h in ('certutil -hashfile "%~1" SHA256 2^>nul') do (
    if not defined CALCOLATA set "CALCOLATA=%%h"
)
set "CALCOLATA=%CALCOLATA: =%"
if /I "%CALCOLATA%"=="%~2" (
    call :log "impronta del file verificata"
    exit /b 0
)
call :errore "Il file scaricato non corrisponde all'originale." ^
    "Riprovare. Se il problema resta, la rete potrebbe avere un proxy" ^
    "che modifica i download."
call :log "impronta attesa %~2 calcolata %CALCOLATA%"
exit /b 1

:log
echo [%DATE% %TIME%] %~1 >> "%LOG%" 2>nul
exit /b 0

:errore
echo.
echo   ##################################################################
echo   #  NON POSSO PROSEGUIRE
echo   ##################################################################
:ciclo_errore
if "%~1"=="" goto :fine_errore
echo   #  %~1
call :log "ERRORE: %~1"
shift
goto :ciclo_errore
:fine_errore
echo   ##################################################################
exit /b 1

:uscita_errore
set "USCITA=2"

:uscita
echo.
echo   Diario di questa fase: %LOG%
echo.
if "%USCITA%"=="0" (
    echo   Puoi chiudere questa finestra.
) else (
    echo   L'installazione non e' andata a buon fine.
    echo   Mandare all'assistenza il file di diario indicato qui sopra.
)
echo.
pause
endlocal & exit /b %USCITA%
