# Beendet ALLES, was zum Bot gehoert: Bot, Tibia, OBS, Projektoren.
#
# Ein einzelner Knopf statt vieler Einzelschritte. Die Reihenfolge ist
# wichtig: erst den Vollstart stoppen (dessen Aufraeum-Block setzt Profil
# und Bildschirm zurueck), dann die Programme beenden. Sonst startet der
# Vollstart die gerade beendeten Programme sofort wieder.
$ErrorActionPreference = 'Continue'

$repo = Join-Path $env:USERPROFILE 'TibiaPilotNG'
$python = Join-Path $repo '.venv\Scripts\python.exe'
$pythonPrefix = Join-Path $repo '.venv\Scripts\python'
$tibiaRoot = Join-Path $env:LOCALAPPDATA 'Tibia'
$erledigt = [ordered]@{}

# 1. Vollstart stoppen. Er wacht sonst ueber den Client und startet neu.
Stop-ScheduledTask -TaskName 'TibiaPilotNG-OneClick' -ErrorAction SilentlyContinue
$erledigt['vollstart'] = 'gestoppt'

# 2. Bot beenden. Gibt auch den seriellen Port des Arduino frei - ohne das
#    bliebe der Chip belegt und der naechste Start meldet ihn faelschlich
#    als "nicht verbunden".
& (Join-Path $repo 'tools\Stop-TibiaPilotNG.ps1') 2>$null | Out-Null
$erledigt['bot'] = 'beendet'

# 3. Auf das echte Ende des alten Laufs warten (der Aufraeum-Block laeuft
#    noch: Profil zuruecksetzen, Bildschirm wiederherstellen).
for ($versuch = 0; $versuch -lt 40; $versuch++) {
    $laeuft = @(Get-CimInstance Win32_Process -Filter "Name = 'powershell.exe'" -ErrorAction SilentlyContinue |
        Where-Object { [string]$_.CommandLine -match 'Start-PilotNG-OneClick' })
    $bot = @(Get-CimInstance Win32_Process -ErrorAction SilentlyContinue | Where-Object {
        $_.ExecutablePath -like "$pythonPrefix*.exe" -and [string]$_.CommandLine -match 'main\.py'
    })
    if ($laeuft.Count -eq 0 -and $bot.Count -eq 0) { break }
    Start-Sleep -Milliseconds 250
}

# 4. Projektor-Fenster schliessen. OBS' Schnittstelle kann sie nicht
#    schliessen, darum ueber das Fenster selbst.
Add-Type -AssemblyName Microsoft.VisualBasic -ErrorAction SilentlyContinue
$projektoren = 0
Get-Process -ErrorAction SilentlyContinue |
    Where-Object { $_.MainWindowTitle -match 'Projektor|Projector' } |
    ForEach-Object {
        $_.CloseMainWindow() | Out-Null
        $projektoren++
    }
$erledigt['projektoren'] = $projektoren

# 5. OBS beenden.
Stop-Process -Name obs64 -Force -ErrorAction SilentlyContinue
$erledigt['obs'] = 'beendet'

# 6. Tibia beenden (Client heisst je nach Version client.exe oder Tibia.exe).
Get-Process client, Tibia -ErrorAction SilentlyContinue |
    Stop-Process -Force -ErrorAction SilentlyContinue
Get-CimInstance Win32_Process -ErrorAction SilentlyContinue | Where-Object {
    $_.ExecutablePath -like "$tibiaRoot\*"
} | ForEach-Object { & taskkill.exe /PID $_.ProcessId /T /F 2>$null | Out-Null }
$erledigt['tibia'] = 'beendet'

# 7. Normalzustand herstellen, falls der Aufraeum-Block des Vollstarts
#    nicht mehr dazu kam (z. B. weil er hart beendet wurde).
if (Test-Path $python) {
    & (Join-Path $repo 'tools\Set-TibiaProfile.ps1') -Profile normal 2>$null | Out-Null
    & $python (Join-Path $repo 'tools\Restore-Bot-Display.py') 2>$null | Out-Null
    $erledigt['bildschirm'] = 'zurueckgesetzt'
}

($erledigt | ConvertTo-Json -Compress)
