param(
  [string]$ProjectRoot
)

# Mit -NoExit gestartet: dieses Fenster bleibt immer offen (siehe dev-admin.cmd),
# aber ein sauberer try/catch mit klarer Meldung ist trotzdem besser als ein
# roher Stacktrace, wenn z.B. der Dev-Port schon belegt ist.
$ErrorActionPreference = "Stop"

try {
  $project = (Resolve-Path -LiteralPath $ProjectRoot).Path

  Write-Host "Projekt: $project"

  # A UAC-elevated process gets its environment rebuilt fresh from the
  # registry; it does NOT inherit PATH edits that only exist in the calling
  # (non-elevated) shell session (e.g. a version manager that only patched
  # the current terminal). If node/npm resolve normally but not here, that
  # is almost always the cause - fail with a clear message instead of a
  # cryptic "npm is not recognized" a few lines down.
  $npmCommand = Get-Command npm.cmd -ErrorAction SilentlyContinue
  if (-not $npmCommand) { $npmCommand = Get-Command npm -ErrorAction SilentlyContinue }
  $nodeCommand = Get-Command node.exe -ErrorAction SilentlyContinue
  if (-not $nodeCommand) { $nodeCommand = Get-Command node -ErrorAction SilentlyContinue }
  if (-not $npmCommand -or -not $nodeCommand) {
    Write-Host ""
    Write-Host "FEHLER: npm/node wurden in diesem administrativen Fenster nicht gefunden." -ForegroundColor Red
    Write-Host "npm gefunden: $([bool]$npmCommand)   node gefunden: $([bool]$nodeCommand)" -ForegroundColor Red
    Write-Host "Ein 'Als Administrator ausfuehren'-Prozess bekommt seine Umgebung frisch aus der Registry -" -ForegroundColor Red
    Write-Host "PATH-Aenderungen, die nur in deiner normalen (nicht-elevierten) Sitzung gelten (z.B. nvm/Volta" -ForegroundColor Red
    Write-Host "ohne dauerhafte Registry-Eintragung), sind hier nicht sichtbar, obwohl 'npm run dev' normal funktioniert." -ForegroundColor Red
    Write-Host "PATH in diesem Fenster:" -ForegroundColor DarkGray
    Write-Host $env:PATH -ForegroundColor DarkGray
    Write-Host ""
    Write-Host "Loesung: node/npm dauerhaft im PATH eintragen (System-Umgebungsvariablen, nicht nur die Sitzung)," -ForegroundColor Yellow
    Write-Host "z.B. ueber die Windows-Systemsteuerung 'Umgebungsvariablen bearbeiten' oder 'setx PATH ...'." -ForegroundColor Yellow
    throw "npm/node nicht im administrativen PATH gefunden."
  }

  # Kill stale instances of THIS project BEFORE checking the port: a leftover
  # electron/vite/node/input-helper cluster from a previous run (e.g. a window
  # force-closed via Task Manager, which skips main.ts's graceful will-quit
  # cleanup and orphans the spawned input-helper.ps1 child) is the most common
  # reason a fresh start silently talks to an old instance instead of
  # replacing it. Shared with "npm run dev" itself via the predev hook, so
  # both start paths get the same guarantee.
  & (Join-Path $PSScriptRoot "kill-stale-instances.ps1")

  $devPort = 5173
  $portInUse = $null
  try {
    $portInUse = Get-NetTCPConnection -LocalPort $devPort -State Listen -ErrorAction Stop | Select-Object -First 1
  } catch {
    # Get-NetTCPConnection kann auf manchen Systemen fehlen; das ist kein Fehler.
    $portInUse = $null
  }
  if ($portInUse) {
    $portOwner = Get-Process -Id $portInUse.OwningProcess -ErrorAction SilentlyContinue
    Write-Host ""
    Write-Host "WARNUNG: Port $devPort ist noch belegt (Prozess: $($portOwner.ProcessName), PID $($portInUse.OwningProcess)) - auch nach dem Beenden alter Instanzen dieses Projekts." -ForegroundColor Yellow
    Write-Host "Das ist wahrscheinlich ein unabhaengiger Prozess (z.B. ein anderes Projekt auf Port $devPort)." -ForegroundColor Yellow
    Write-Host "'npm run dev' weicht dann auf einen anderen Port aus oder verbindet sich mit dem falschen Server." -ForegroundColor Yellow
    Write-Host "Falls noetig: Prozess PID $($portInUse.OwningProcess) manuell beenden und dieses Fenster neu starten." -ForegroundColor Yellow
    Write-Host ""
  }

  Set-Location -LiteralPath $project
  Write-Host "Starte npm run dev (Administrator)..."
  npm run dev
  $exitCode = $LASTEXITCODE

  if ($exitCode -ne 0) {
    Write-Host ""
    Write-Host "npm run dev wurde mit Fehlercode $exitCode beendet." -ForegroundColor Red
    Write-Host "Die Ausgabe oben zeigt die genaue Ursache (z.B. belegter Port, fehlende Abhaengigkeiten)." -ForegroundColor Red
  } else {
    Write-Host ""
    Write-Host "npm run dev wurde beendet (Fenster schliessen oder Strg+C fuer Neustart)."
  }
} catch {
  Write-Host ""
  Write-Host "Fehler beim Start: $($_.Exception.Message)" -ForegroundColor Red
  Write-Host $_.ScriptStackTrace -ForegroundColor DarkGray
}

Write-Host ""
Write-Host "Dieses Fenster bleibt offen (siehe Meldungen oben). Schliessen mit Enter oder dem Fenster-X."
