@echo off
setlocal EnableExtensions EnableDelayedExpansion

set "ROOT_DIR=%~dp0"
set "CONFIG_DIR=%ROOT_DIR%config"
set "CONFIG_FILE=%CONFIG_DIR%\cloudflare-access.env"
set "EXAMPLE_FILE=%CONFIG_DIR%\cloudflare-access.example.env"

set "HOSTNAME=ssh-rip.beneditoonline.org"
set "ACCESS_TCP_HOST=127.0.0.1"
set "ACCESS_TCP_PORT=3443"
set "ACCESS_TCP_URL=127.0.0.1:3443"
set "SSH_USER=lucas"
set "SSH_HOST=127.0.0.1"
set "SSH_PORT=3443"
set "SOCKS_HOST=127.0.0.1"
set "SOCKS_PORT=1080"
set "BALTA_URL=https://ripp.beneditoonline.org/"
set "FIREFOX_PATH="
set "CLOUDFLARED_PATH="
set "SSH_PATH="

if not exist "%CONFIG_DIR%" mkdir "%CONFIG_DIR%"

if not exist "%CONFIG_FILE%" (
    if exist "%EXAMPLE_FILE%" copy "%EXAMPLE_FILE%" "%CONFIG_FILE%" >nul
)

if exist "%CONFIG_FILE%" (
    for /f "usebackq tokens=1,* delims==" %%A in ("%CONFIG_FILE%") do (
        if /I "%%A"=="CLOUDFLARED_HOSTNAME" set "HOSTNAME=%%B"
        if /I "%%A"=="ACCESS_TCP_HOST" set "ACCESS_TCP_HOST=%%B"
        if /I "%%A"=="ACCESS_TCP_PORT" set "ACCESS_TCP_PORT=%%B"
        if /I "%%A"=="ACCESS_TCP_URL" set "ACCESS_TCP_URL=%%B"
        if /I "%%A"=="SSH_USER" set "SSH_USER=%%B"
        if /I "%%A"=="SSH_HOST" set "SSH_HOST=%%B"
        if /I "%%A"=="SSH_PORT" set "SSH_PORT=%%B"
        if /I "%%A"=="LOCAL_SOCKS_HOST" set "SOCKS_HOST=%%B"
        if /I "%%A"=="LOCAL_SOCKS_PORT" set "SOCKS_PORT=%%B"
        if /I "%%A"=="BALTA_URL" set "BALTA_URL=%%B"
        if /I "%%A"=="FIREFOX_PATH" set "FIREFOX_PATH=%%B"
        if /I "%%A"=="CLOUDFLARED_PATH" set "CLOUDFLARED_PATH=%%B"
        if /I "%%A"=="SSH_PATH" set "SSH_PATH=%%B"
    )
)

call :parse_access_tcp_url "%ACCESS_TCP_URL%"
if errorlevel 1 set "ACCESS_TCP_URL=%ACCESS_TCP_HOST%:%ACCESS_TCP_PORT%"
set "OLD_ACCESS_TCP_PORT=%ACCESS_TCP_PORT%"

echo.
echo RATO - CONFIGURAR
echo ================
echo.
echo Este assistente pede apenas dados de configuracao.
echo Aperte ENTER para manter o valor entre colchetes.
echo.

set "VALUE="
set /p "VALUE=Endereco Cloudflare Access [%HOSTNAME%]: "
if defined VALUE set "HOSTNAME=%VALUE%"

set "VALUE="
set /p "VALUE=Listener local Cloudflare [%ACCESS_TCP_URL%]: "
if defined VALUE set "ACCESS_TCP_URL=%VALUE%"
call :parse_access_tcp_url "%ACCESS_TCP_URL%"
if errorlevel 1 (
    echo.
    echo [ERRO] Listener local invalido: %ACCESS_TCP_URL%
    echo Use host:porta, por exemplo 127.0.0.1:3443.
    pause
    exit /b 1
)
set "ACCESS_TCP_URL=%ACCESS_TCP_HOST%:%ACCESS_TCP_PORT%"
if "%SSH_PORT%"=="%OLD_ACCESS_TCP_PORT%" set "SSH_PORT=%ACCESS_TCP_PORT%"

set "VALUE="
set /p "VALUE=Usuario SSH [%SSH_USER%]: "
if defined VALUE set "SSH_USER=%VALUE%"

set "VALUE="
set /p "VALUE=Host SSH local [%SSH_HOST%]: "
if defined VALUE set "SSH_HOST=%VALUE%"

set "VALUE="
set /p "VALUE=Porta SSH local [%SSH_PORT%]: "
if defined VALUE set "SSH_PORT=%VALUE%"
call :validate_port "%SSH_PORT%" "Porta SSH"
if errorlevel 1 exit /b 1

set "VALUE="
set /p "VALUE=Host SOCKS5 local [%SOCKS_HOST%]: "
if defined VALUE set "SOCKS_HOST=%VALUE%"

set "VALUE="
set /p "VALUE=Porta SOCKS5 local [%SOCKS_PORT%]: "
if defined VALUE set "SOCKS_PORT=%VALUE%"
call :validate_port "%SOCKS_PORT%" "Porta SOCKS5"
if errorlevel 1 exit /b 1

set "VALUE="
set /p "VALUE=Link do Balta [%BALTA_URL%]: "
if defined VALUE set "BALTA_URL=%VALUE%"

set "VALUE="
set /p "VALUE=Caminho do Firefox, se precisar [%FIREFOX_PATH%]: "
if defined VALUE set "FIREFOX_PATH=%VALUE%"

set "VALUE="
set /p "VALUE=Caminho do cloud.exe/cloudflared/hehe, se precisar [%CLOUDFLARED_PATH%]: "
if defined VALUE set "CLOUDFLARED_PATH=%VALUE%"

set "VALUE="
set /p "VALUE=Caminho do ssh.exe, se precisar [%SSH_PATH%]: "
if defined VALUE set "SSH_PATH=%VALUE%"

> "%CONFIG_FILE%" echo CLOUDFLARED_HOSTNAME=!HOSTNAME!
>> "%CONFIG_FILE%" echo ACCESS_TCP_HOST=!ACCESS_TCP_HOST!
>> "%CONFIG_FILE%" echo ACCESS_TCP_PORT=!ACCESS_TCP_PORT!
>> "%CONFIG_FILE%" echo ACCESS_TCP_URL=!ACCESS_TCP_URL!
>> "%CONFIG_FILE%" echo SSH_USER=!SSH_USER!
>> "%CONFIG_FILE%" echo SSH_HOST=!SSH_HOST!
>> "%CONFIG_FILE%" echo SSH_PORT=!SSH_PORT!
>> "%CONFIG_FILE%" echo LOCAL_SOCKS_HOST=!SOCKS_HOST!
>> "%CONFIG_FILE%" echo LOCAL_SOCKS_PORT=!SOCKS_PORT!
>> "%CONFIG_FILE%" echo BALTA_URL=!BALTA_URL!
>> "%CONFIG_FILE%" echo FIREFOX_PATH=!FIREFOX_PATH!
>> "%CONFIG_FILE%" echo CLOUDFLARED_PATH=!CLOUDFLARED_PATH!
>> "%CONFIG_FILE%" echo SSH_PATH=!SSH_PATH!

echo.
echo Configuracao salva.
echo Agora rode 1-checar.cmd e depois 2-ligar.cmd.
echo.
pause
exit /b 0

:parse_access_tcp_url
set "PARSE_VALUE=%~1"
set "PARSE_HOST="
set "PARSE_PORT="
for /f "tokens=1,2 delims=:" %%A in ("%PARSE_VALUE%") do (
    set "PARSE_HOST=%%A"
    set "PARSE_PORT=%%B"
)
if not defined PARSE_HOST exit /b 1
if not defined PARSE_PORT exit /b 1
call :validate_port "%PARSE_PORT%" "Porta Cloudflare"
if errorlevel 1 exit /b 1
set "ACCESS_TCP_HOST=%PARSE_HOST%"
set "ACCESS_TCP_PORT=%PARSE_PORT%"
exit /b 0

:validate_port
set "PORT_VALUE=%~1"
set "PORT_LABEL=%~2"
echo(%PORT_VALUE%| findstr /r "^[0-9][0-9]*$" >nul
if errorlevel 1 goto invalid_port

:strip_port_zero
if "%PORT_VALUE%"=="0" goto port_range_check
if "%PORT_VALUE:~0,1%"=="0" (
    set "PORT_VALUE=%PORT_VALUE:~1%"
    goto strip_port_zero
)

:port_range_check
if %PORT_VALUE% LSS 1 goto invalid_port
if %PORT_VALUE% GTR 65535 goto invalid_port
exit /b 0

:invalid_port
echo.
echo [ERRO] %PORT_LABEL% invalida: %~1
echo Use um numero entre 1 e 65535.
pause
exit /b 1
