# Beendet alle laufenden Prozesse dieses Projekts (Electron, Node/Vite, und
# einen verwaisten lokalen Input-Helper-Kindprozess), bevor eine neue Instanz
# startet.
#
# Warum das noetig ist: Ein normales Schliessen der App (X-Button) raeumt
# sauber auf (main.ts: app.on("will-quit") beendet den gespawnten
# input-helper.ps1-Kindprozess). Wird die App aber gewaltsam beendet - z.B.
# ueber Task-Manager "Task beenden" oder ein Skript, das Stop-Process -Force
# auf den Electron-Prozess anwendet - greift dieser Cleanup-Handler NICHT,
# und der Kindprozess (PowerShell mit dem Input-Helper) bleibt als Waise
# aktiv, obwohl das Hauptfenster laengst weg ist. Dieses Skript faengt genau
# das ab: es wird vor JEDEM Start (npm run dev und npm run dev:admin, ueber
# den "predev"-Hook) ausgefuehrt und raeumt vorherige Instanzen kompromisslos
# weg, egal wie sie beendet wurden.

$ErrorActionPreference = "Stop"
$project = (Resolve-Path -LiteralPath (Join-Path $PSScriptRoot "..")).Path
$electronPath = Join-Path $project "node_modules\electron\dist\electron.exe"

$killed = 0

Get-CimInstance Win32_Process |
  Where-Object {
    ($_.Name -eq "electron.exe" -and $_.ExecutablePath -eq $electronPath) -or
    ($_.Name -eq "node.exe" -and $_.CommandLine -like "*$project*") -or
    ($_.Name -eq "powershell.exe" -and $_.CommandLine -like "*input-helper.ps1*")
  } |
  ForEach-Object {
    Write-Host "Beende alte Instanz: $($_.Name) (PID $($_.ProcessId))"
    Stop-Process -Id $_.ProcessId -Force -ErrorAction SilentlyContinue
    $killed++
  }

if ($killed -gt 0) {
  # Windows braucht einen Moment, um Ports/Handles wirklich freizugeben.
  Start-Sleep -Milliseconds 500
  Write-Host "$killed alte Prozess(e) beendet."
} else {
  Write-Host "Keine alten Instanzen gefunden."
}
