@echo off
setlocal
title EuroTrans - Instalar plugin de telemetria ETS2

echo ==========================================================
echo  EuroTrans - Instalando el plugin de telemetria de ETS2
echo ==========================================================
echo.
echo Este programa va a:
echo   1. Descargar el plugin de telemetria (Funbit/ets2-telemetry-server)
echo   2. Buscar tu carpeta de instalacion de ETS2 (si no la encuentra
echo      solo, te va a pedir que la pegues)
echo   3. Copiar el plugin ahi mismo
echo   4. Configurar el firewall de Windows (te va a pedir permiso de
echo      Administrador una sola vez)
echo   5. Iniciar el servidor y verificar que quedo funcionando
echo.
echo (Este archivo es autosuficiente: no necesita ningun otro archivo en la
echo  misma carpeta. Todo el script vive dentro de este .bat.)
echo.
pause

powershell -NoProfile -ExecutionPolicy Bypass -Command "& { $marker = 'REM ' + 'EUROTRANS_PS1_START'; $body = (Get-Content -Raw -LiteralPath '%~f0') -split [regex]::Escape($marker), 2; Invoke-Expression $body[1] }"

echo.
echo ==========================================================
echo  Listo. Puedes cerrar esta ventana.
echo ==========================================================
pause
exit /b

REM EUROTRANS_PS1_START
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$ErrorActionPreference = "Stop"

$AddToStartup    = $true
$LaunchGame      = $true
$Ets2SteamAppId  = "227300"
$InstallDir      = "$env:LOCALAPPDATA\EuroTrans\ets2-telemetry-server"
$TelemetryUrl    = "http://127.0.0.1:25555/api/ets2/telemetry"

function Write-Step($msg) { Write-Host "`n==> $msg" -ForegroundColor Cyan }
function Write-Ok($msg)   { Write-Host "[OK] $msg" -ForegroundColor Green }
function Write-Warn($msg) { Write-Host "[!] $msg" -ForegroundColor Yellow }
function Write-Err($msg)  { Write-Host "[ERROR] $msg" -ForegroundColor Red }

function Test-Telemetry {
  param([int]$TimeoutSec = 3)
  try {
    $res = Invoke-WebRequest -Uri $TelemetryUrl -TimeoutSec $TimeoutSec -UseBasicParsing
    $json = $res.Content | ConvertFrom-Json
    return [pscustomobject]@{ ServerUp = $true; Connected = [bool]$json.game.connected }
  } catch {
    return [pscustomobject]@{ ServerUp = $false; Connected = $false }
  }
}

function Test-IsEts2Folder {
  param([string]$Path)
  if (-not $Path -or -not (Test-Path $Path)) { return $false }
  return (Test-Path (Join-Path $Path "bin\win_x64\eurotrucks2.exe")) -or
         (Test-Path (Join-Path $Path "bin\win_x86\eurotrucks2.exe"))
}

function Get-Ets2Arch {
  param([string]$Path)
  if (Test-Path (Join-Path $Path "bin\win_x64\eurotrucks2.exe")) { return "win_x64" }
  return "win_x86"
}

function Find-Ets2Path {
  Write-Step "Buscando tu instalacion de Euro Truck Simulator 2..."

  $candidates = New-Object System.Collections.Generic.List[string]
  $candidates.Add("C:\Program Files (x86)\Steam\steamapps\common\Euro Truck Simulator 2")
  $candidates.Add("C:\Program Files\Steam\steamapps\common\Euro Truck Simulator 2")
  $candidates.Add("C:\Program Files (x86)\Euro Truck Simulator 2")

  $steamPaths = New-Object System.Collections.Generic.List[string]
  foreach ($regPath in @(
    "HKLM:\SOFTWARE\WOW6432Node\Valve\Steam",
    "HKLM:\SOFTWARE\Valve\Steam",
    "HKCU:\SOFTWARE\Valve\Steam"
  )) {
    try {
      $props = Get-ItemProperty -Path $regPath -ErrorAction SilentlyContinue
      if ($props.InstallPath) { $steamPaths.Add($props.InstallPath) }
      if ($props.SteamPath)   { $steamPaths.Add($props.SteamPath) }
    } catch { }
  }

  foreach ($steamPath in ($steamPaths | Select-Object -Unique)) {
    $candidates.Add((Join-Path $steamPath "steamapps\common\Euro Truck Simulator 2"))

    $vdf = Join-Path $steamPath "steamapps\libraryfolders.vdf"
    if (Test-Path $vdf) {
      try {
        $content = Get-Content $vdf -Raw
        $matches = [regex]::Matches($content, '"path"\s*"([^"]+)"')
        foreach ($m in $matches) {
          $lib = $m.Groups[1].Value -replace '\\\\', '\'
          $candidates.Add((Join-Path $lib "steamapps\common\Euro Truck Simulator 2"))
        }
      } catch { }
    }
  }

  foreach ($c in ($candidates | Select-Object -Unique)) {
    if (Test-IsEts2Folder $c) {
      Write-Ok "Encontrado automaticamente en: $c"
      return $c
    }
  }

  Write-Warn "No se pudo encontrar la carpeta de ETS2 automaticamente."
  for ($attempt = 1; $attempt -le 3; $attempt++) {
    $manual = Read-Host "Pega la ruta completa de la carpeta de instalacion de ETS2 (la que contiene la carpeta 'bin')"
    $manual = $manual.Trim('"').Trim()
    if (Test-IsEts2Folder $manual) {
      Write-Ok "Carpeta valida: $manual"
      return $manual
    }
    Write-Err "No se encontro bin\win_x64\eurotrucks2.exe (ni win_x86) dentro de '$manual'. Intento $attempt de 3."
  }
  return $null
}

function Test-IsAdmin {
  $id = [Security.Principal.WindowsIdentity]::GetCurrent()
  $principal = New-Object Security.Principal.WindowsPrincipal($id)
  return $principal.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
}

function Install-FirewallAndUrlAcl {
  Write-Step "Configurando el firewall y el permiso de red de Windows (una sola vez)..."

  $setupScript = @'
$ruleName = "ETS2 TELEMETRY SERVER (PORT 25555)"
$existingRule = netsh advfirewall firewall show rule name="$ruleName" 2>&1
if ($LASTEXITCODE -ne 0 -or $existingRule -match "No rules match") {
  netsh advfirewall firewall add rule name="$ruleName" dir=in action=allow protocol=TCP localport=25555 profile=private,domain | Out-Null
}

$existingAcl = netsh http show urlacl url=http://+:25555/ 2>&1
if ($existingAcl -notmatch "Reserved URL") {
  netsh http add urlacl url=http://+:25555/ user=Everyone | Out-Null
}
'@

  if (Test-IsAdmin) {
    Invoke-Expression $setupScript
  } else {
    $tempScriptPath = Join-Path $env:TEMP "eurotrans-netsh-setup.ps1"
    Set-Content -Path $tempScriptPath -Value $setupScript -Encoding ASCII
    Write-Warn "Windows va a pedir permiso de Administrador para esto - acepta esa ventana."
    Start-Process -FilePath "powershell" -ArgumentList "-NoProfile","-ExecutionPolicy","Bypass","-File",$tempScriptPath -Verb RunAs -Wait
    Remove-Item $tempScriptPath -ErrorAction SilentlyContinue
  }
  Write-Ok "Firewall y permisos configurados."
}

Write-Step "Verificando si el plugin ya esta instalado y corriendo..."
$already = Test-Telemetry -TimeoutSec 2
if ($already.ServerUp) {
  Write-Ok "El servidor de telemetria ya esta corriendo en $TelemetryUrl. No hace falta reinstalar."
  if (-not $already.Connected) {
    Write-Warn "Abre ETS2 y entra a una partida para que el juego se conecte."
  }
  return
}

$GamePath = Find-Ets2Path
if (-not $GamePath -or -not (Test-IsEts2Folder $GamePath)) {
  Write-Err "No se pudo determinar la carpeta de ETS2. Instalacion cancelada."
  exit 1
}

$arch = Get-Ets2Arch -Path $GamePath
Write-Ok "Version del juego detectada: $arch"

$zipUrl = "https://github.com/Funbit/ets2-telemetry-server/archive/refs/heads/master.zip"
$zipPath = Join-Path $env:TEMP "ets2-telemetry-server.zip"
$extractRoot = Join-Path $env:TEMP "ets2-telemetry-server-extract"

Write-Step "Descargando el plugin de telemetria (Funbit/ets2-telemetry-server)..."
Invoke-WebRequest -Uri $zipUrl -OutFile $zipPath -UseBasicParsing
Write-Ok "Descargado en $zipPath"

Write-Step "Extrayendo..."
if (Test-Path $extractRoot) { Remove-Item $extractRoot -Recurse -Force }
Expand-Archive -Path $zipPath -DestinationPath $extractRoot -Force

$sourceDir = Get-ChildItem $extractRoot -Directory | Select-Object -First 1
if (-not $sourceDir) {
  Write-Err "No se encontro el contenido extraido del plugin."
  exit 1
}

if (Test-Path $InstallDir) { Remove-Item $InstallDir -Recurse -Force }
New-Item -ItemType Directory -Path (Split-Path $InstallDir) -Force | Out-Null
Move-Item $sourceDir.FullName $InstallDir
Write-Ok "Servidor de telemetria instalado en $InstallDir"

$dllSource = Join-Path $InstallDir "server\Ets2Plugins\$arch\plugins\ets2-telemetry-server.dll"
if (-not (Test-Path $dllSource)) {
  Write-Err "No se encontro el plugin ($dllSource). La estructura del paquete pudo haber cambiado."
  exit 1
}

$pluginsDir = Join-Path $GamePath "bin\$arch\plugins"
Write-Step "Copiando el plugin a $pluginsDir ..."
New-Item -ItemType Directory -Path $pluginsDir -Force | Out-Null
Copy-Item $dllSource (Join-Path $pluginsDir "ets2-telemetry-server.dll") -Force
Write-Ok "Plugin copiado correctamente."

Install-FirewallAndUrlAcl

$exePath = Join-Path $InstallDir "server\Ets2Telemetry.exe"
Write-Step "Iniciando el servidor de telemetria..."
Write-Warn "Puede aparecer una ventana preguntando por la carpeta de 'American Truck Simulator' (ATS),"
Write-Warn "otro juego de la misma compania que el plugin tambien soporta. Si no tienes ATS instalado,"
Write-Warn "hace clic en 'Cancel'/'Cancelar' en esa ventana - es normal y no afecta a tu plugin de ETS2,"
Write-Warn "que este script ya copio en el paso anterior."
Start-Process -FilePath $exePath

if ($LaunchGame) {
  Write-Step "Abriendo Euro Truck Simulator 2..."
  try {
    Start-Process "steam://rungameid/$Ets2SteamAppId"
    Write-Ok "Se esta abriendo el juego (si Steam no estaba abierto, puede tardar unos segundos en arrancar)."
  } catch {
    Write-Warn "No se pudo abrir el juego automaticamente: $($_.Exception.Message)"
    Write-Warn "Abrelo manualmente desde Steam."
  }
}

if ($AddToStartup) {
  try {
    $startupDir = [Environment]::GetFolderPath("Startup")
    $shortcutPath = Join-Path $startupDir "EuroTrans - Servidor de Telemetria.lnk"
    $shell = New-Object -ComObject WScript.Shell
    $shortcut = $shell.CreateShortcut($shortcutPath)
    $shortcut.TargetPath = $exePath
    $shortcut.WorkingDirectory = Split-Path $exePath
    $shortcut.Description = "Servidor de telemetria de EuroTrans para ETS2"
    $shortcut.Save()
    Write-Ok "Se agrego un acceso directo en el inicio de Windows, asi no tienes que abrirlo cada vez."
  } catch {
    Write-Warn "No se pudo crear el acceso directo de inicio automatico (no es critico): $($_.Exception.Message)"
  }
}

# Accesos directos para volver a abrir el servidor a mano, con el icono del
# propio juego (no copiamos el .exe en si: el servidor necesita los archivos
# que tiene al lado en "server\", como la pagina web de su panel, y una copia
# suelta del .exe no funcionaria). El acceso directo apunta al original pero
# usa el icono de eurotrucks2.exe, asi que se ve y se comporta igual.
function New-Ets2TelemetryShortcut {
  param([string]$ShortcutPath, [string]$TargetExe, [string]$IconSourceExe)
  $shell = New-Object -ComObject WScript.Shell
  $shortcut = $shell.CreateShortcut($ShortcutPath)
  $shortcut.TargetPath = $TargetExe
  $shortcut.WorkingDirectory = Split-Path $TargetExe
  $shortcut.Description = "Servidor de telemetria de EuroTrans para ETS2"
  if ($IconSourceExe -and (Test-Path $IconSourceExe)) {
    $shortcut.IconLocation = "$IconSourceExe,0"
  }
  $shortcut.Save()
}

Write-Step "Creando accesos directos con el icono del juego..."
$gameExe = Join-Path $GamePath "bin\$arch\eurotrucks2.exe"
$desktopDir = [Environment]::GetFolderPath("Desktop")
$downloadFolder = (Get-Location).Path

try {
  New-Ets2TelemetryShortcut -ShortcutPath (Join-Path $desktopDir "Ets2Telemetry.exe.lnk") -TargetExe $exePath -IconSourceExe $gameExe
  Write-Ok "Acceso directo creado en el escritorio."
} catch {
  Write-Warn "No se pudo crear el acceso directo en el escritorio (no es critico): $($_.Exception.Message)"
}

try {
  New-Ets2TelemetryShortcut -ShortcutPath (Join-Path $downloadFolder "Ets2Telemetry.exe.lnk") -TargetExe $exePath -IconSourceExe $gameExe
  Write-Ok "Acceso directo creado en $downloadFolder."
} catch {
  Write-Warn "No se pudo crear el acceso directo en $downloadFolder (no es critico): $($_.Exception.Message)"
}

Write-Step "Verificando la instalacion..."
$ok = $false
for ($i = 1; $i -le 10; $i++) {
  Start-Sleep -Seconds 2
  $status = Test-Telemetry -TimeoutSec 3
  if ($status.ServerUp) { $ok = $true; break }
  Write-Host "  intento $i/10..."
}

if ($ok) {
  Write-Ok "El servidor de telemetria esta corriendo en $TelemetryUrl"
  if ($LaunchGame) {
    Write-Warn "Euro Truck Simulator 2 se esta abriendo solo. Espera a que cargue y entra a una partida para que se conecte."
  } else {
    Write-Warn "Abre Euro Truck Simulator 2 y entra a una partida para que se conecte."
  }
  Write-Ok "Instalacion completa."
} else {
  Write-Err "El plugin se copio y el servidor se configuro, pero no se pudo confirmar que este respondiendo."
  Write-Err "Intenta abrir $exePath manualmente y revisa si muestra algun error en pantalla."
  exit 1
}
