param(
    [string]$VisionModel = 'qwen2.5vl:7b',
    [string]$ChatModel = 'qwen3:4b'
)

# Richtet das lokale KI fuer den Bot ein - zwei Modelle, beide lokal:
#   - Vision (qwen2.5vl): der Smart-Recovery-Blick. Bleibt der Bot haengen,
#     schaut die KI auf den Bildschirm und findet selbst wieder heraus.
#   - Text (qwen3): formuliert Chat-Antworten an Spieler/GMs menschlich um
#     (nur wenn im Bot aktiviert - src/gameplay/chatbot/llm.py).
# Idempotent: jederzeit erneut ausfuehrbar, um Ollama/Modelle zu
# aktualisieren oder eine defekte Installation zu reparieren.

$ErrorActionPreference = 'Stop'

function Refresh-Path {
    $machine = [Environment]::GetEnvironmentVariable('Path', 'Machine')
    $user = [Environment]::GetEnvironmentVariable('Path', 'User')
    $env:Path = "$machine;$user"
}

$exe = Join-Path $env:LOCALAPPDATA 'Programs\Ollama\ollama.exe'

if (!(Test-Path $exe) -and !(Get-Command ollama.exe -ErrorAction SilentlyContinue)) {
    Write-Output 'Installiere Ollama ...'
    & winget.exe install --exact --id Ollama.Ollama --silent --disable-interactivity --accept-package-agreements --accept-source-agreements
    if ($LASTEXITCODE -ne 0) { throw 'Ollama-Installation fehlgeschlagen.' }
    Refresh-Path
}
if (!(Test-Path $exe)) {
    $exe = (Get-Command ollama.exe -ErrorAction Stop).Source
}

# Server als geplante Aufgabe: startet mit der Anmeldung, laeuft ohne
# Desktop-Session (robust gegenueber SSH-/Konsolen-Ende).
schtasks /create /tn 'OllamaServe' /tr "`"$exe`" serve" /sc onlogon /rl limited /f | Out-Null
schtasks /run /tn 'OllamaServe' | Out-Null

$ready = $false
foreach ($attempt in 1..10) {
    try {
        Invoke-RestMethod 'http://localhost:11434/api/tags' -TimeoutSec 5 | Out-Null
        $ready = $true
        break
    } catch {
        Start-Sleep -Seconds 3
    }
}
if (!$ready) { throw 'Ollama-Server antwortet nicht auf localhost:11434.' }

function Pull-Model([string]$Model, [string]$Zweck) {
    Write-Output "Lade $Zweck-Modell $Model (idempotent) ..."
    & $exe pull $Model
    if ($LASTEXITCODE -ne 0) { throw "Modell konnte nicht geladen werden: $Model" }
    $family = $Model.Split(':')[0] + ':'
    $tags = Invoke-RestMethod 'http://localhost:11434/api/tags' -TimeoutSec 10
    if (!($tags.models | Where-Object { $_.name.StartsWith($family) })) {
        throw "Modell fehlt nach dem Pull: $Model"
    }
}

# Beide Modelle lokal ziehen: Smart-Recovery-Blick (Vision) und die
# menschlichen Chat-Antworten (Text). So braucht der Bot-PC keinen
# separaten Server.
Pull-Model $VisionModel 'Vision (Smart-Recovery)'
Pull-Model $ChatModel 'Chat (menschliche Antworten)'

Write-Output "LLM bereit: $VisionModel + $ChatModel auf http://localhost:11434 (der Bot erkennt beide automatisch)."
