# Startet den Vollstart (TibiaPilotNG-OneClick) verlaesslich.
#
# Windows laesst eine geplante Aufgabe im Zustand "Running" haengen, wenn
# eine fruehere Ausfuehrung nicht sauber beendet wurde. Jeder weitere
# Start wird dann STILL ignoriert - der Nutzer drueckt und nichts
# passiert. Darum: haengenden Zustand erkennen (Aufgabe laeuft, aber es
# gibt keinen echten Prozess dazu) und vorher aufloesen.
$ErrorActionPreference = 'Stop'
$taskName = 'TibiaPilotNG-OneClick'
$repo = Join-Path $env:USERPROFILE 'TibiaPilotNG'
$python = Join-Path $repo '.venv\Scripts\python.exe'

$task = Get-ScheduledTask -TaskName $taskName -ErrorAction SilentlyContinue
if (!$task) {
    throw "Die Startaufgabe '$taskName' fehlt. Bitte tools\Install-PilotNG-OneClick.ps1 einmal ausfuehren."
}

$alive = @(Get-CimInstance Win32_Process -Filter "Name = 'powershell.exe'" -ErrorAction SilentlyContinue |
    Where-Object { [string]$_.CommandLine -match 'Start-PilotNG-OneClick' })

if ($task.State -eq 'Running' -and $alive.Count -gt 0) {
    # Der Bot laeuft bereits. Liegt der Client aber nicht mehr auf dem im
    # Programm gewaehlten Bildschirm (der Nutzer hat den Bildschirm
    # gewechselt), muss neu gestartet werden - sonst drueckt der Nutzer
    # "Start" und der Client bleibt stillschweigend auf dem alten
    # Bildschirm. Liegt er noch richtig, bleibt alles wie es ist.
    $displayState = 'ok'
    if (Test-Path $python) {
        $displayState = & $python (Join-Path $repo 'tools\Check-Client-Display.py') 2>$null
    }
    if ($displayState -ne 'mismatch') {
        Write-Output 'already-running'
        exit 0
    }
    # Bildschirmwechsel erkannt: laufende Sitzung sauber beenden und unten
    # frisch starten (der Vollstart setzt Profil, Bildschirm und Fenster neu).
    Stop-ScheduledTask -TaskName $taskName -ErrorAction SilentlyContinue
    # Auf das ECHTE Ende des alten Laufs warten, nicht nur auf den Task-
    # Status. Beim Stoppen laeuft der Aufraeum-Block (finally) des alten
    # Laufs noch weiter - Bot beenden, Profil und Bildschirm zuruecksetzen.
    # Startet der neue Lauf dazwischen, streiten sich beide um den seriellen
    # Port des Arduino, und der Chip wird faelschlich als "nicht verbunden"
    # gemeldet (und unnoetig neu geflasht). Darum warten, bis der alte
    # Start-PilotNG-OneClick-Prozess und der Bot (main.py) wirklich weg sind.
    # Der Bot laeuft als python.exe ODER pythonw.exe. Der kanonische Stop
    # gibt den Arduino sauber frei (Release-Arduino.py) und beendet beide
    # Varianten - ein eigener Kill nur auf python.exe wuerde pythonw.exe
    # verfehlen, und der Chip bliebe 25 s belegt.
    $pythonPrefix = Join-Path $repo '.venv\Scripts\python'
    & (Join-Path $repo 'tools\Stop-TibiaPilotNG.ps1') 2>$null | Out-Null
    # Auch den Tibia-Client beenden. Sonst sieht der frische Lauf ein noch
    # laufendes Spiel, ueberspringt den Neustart und der Client bliebe auf
    # dem alten Bildschirm. Nach dem Wechsel wird ohnehin neu eingeloggt.
    $tibiaRoot = Join-Path $env:LOCALAPPDATA 'Tibia'
    Get-Process client, Tibia -ErrorAction SilentlyContinue |
        Stop-Process -Force -ErrorAction SilentlyContinue
    Get-CimInstance Win32_Process | Where-Object {
        $_.ExecutablePath -like "$tibiaRoot\*"
    } | ForEach-Object { & taskkill.exe /PID $_.ProcessId /T /F 2>$null | Out-Null }
    for ($attempt = 0; $attempt -lt 120; $attempt++) {
        $oldRun = @(Get-CimInstance Win32_Process -Filter "Name = 'powershell.exe'" -ErrorAction SilentlyContinue |
            Where-Object { [string]$_.CommandLine -match 'Start-PilotNG-OneClick' })
        $botAlive = @(Get-CimInstance Win32_Process | Where-Object {
            $_.ExecutablePath -like "$pythonPrefix*.exe" -and [string]$_.CommandLine -match 'main\.py'
        })
        if ($oldRun.Count -eq 0 -and $botAlive.Count -eq 0) { break }
        Start-Sleep -Milliseconds 250
    }
    # Kurzer Moment, damit Windows den COM-Port wirklich freigibt.
    Start-Sleep -Milliseconds 800
    Write-Output 'display-changed-restarting'
    $task = Get-ScheduledTask -TaskName $taskName -ErrorAction SilentlyContinue
}
if ($task.State -eq 'Running') {
    # Karteileiche: Aufgabe meldet "laeuft", es gibt aber keinen Prozess.
    Stop-ScheduledTask -TaskName $taskName -ErrorAction SilentlyContinue
    for ($attempt = 0; $attempt -lt 20; $attempt++) {
        Start-Sleep -Milliseconds 250
        if ((Get-ScheduledTask -TaskName $taskName).State -ne 'Running') { break }
    }
    Write-Output 'stale-instance-cleared'
}

Start-ScheduledTask -TaskName $taskName
Write-Output 'started'
