# Stellt sicher, dass Windows die deutsche Tastatur (de-DE, 0407) aktiv hat.
#
# Warum das sein MUSS: Der Arduino tippt mit KeyboardLayout_de_DE
# (arduino/pilotng_leonardo/pilotng_leonardo.ino). Die Bibliothek waehlt
# fuer jedes Zeichen den Scancode, der auf einem DEUTSCHEN Windows-Layout
# das richtige Zeichen ergibt. Steht Windows auf US, kommt aus "@" ein
# Anfuehrungszeichen und aus "z" ein "y" - der Login mit E-Mail-Adresse
# schlaegt dann jedes Mal fehl.
#
# Idempotent: fuegt de-DE nur hinzu, wenn es fehlt, und laesst alle anderen
# Sprachen unberuehrt. Gibt am Ende JSON aus, damit der Selbsttest den
# Zustand pruefen kann.

$ErrorActionPreference = 'Stop'

$ZielTag = 'de-DE'
$ZielTip = '0407:00000407'   # de-DE, deutsches Standardlayout

function Get-AktiverTag {
    try {
        Add-Type -AssemblyName System.Windows.Forms
        return [System.Windows.Forms.InputLanguage]::CurrentInputLanguage.Culture.Name
    } catch { return $null }
}

$geaendert = @()

# 1. de-DE in die Benutzer-Sprachliste aufnehmen (bestehende behalten).
try {
    $liste = Get-WinUserLanguageList
    if (-not ($liste | Where-Object { $_.LanguageTag -eq $ZielTag })) {
        $liste.Add($ZielTag)
        Set-WinUserLanguageList $liste -Force
        $geaendert += 'sprachliste'
    }
    # Sicherstellen, dass das Standardlayout 0407 als Eingabemethode dranhaengt.
    $liste = Get-WinUserLanguageList
    $de = $liste | Where-Object { $_.LanguageTag -eq $ZielTag } | Select-Object -First 1
    if ($de -and -not ($de.InputMethodTips -contains $ZielTip)) {
        $de.InputMethodTips.Clear()
        $de.InputMethodTips.Add($ZielTip)
        Set-WinUserLanguageList $liste -Force
        $geaendert += 'eingabemethode'
    }
} catch {
    Write-Warning "Sprachliste konnte nicht gesetzt werden: $($_.Exception.Message)"
}

# 2. de-DE als Standard-Eingabemethode ueber alle Apps erzwingen.
try {
    Set-WinDefaultInputMethodOverride -InputTip $ZielTip
    $geaendert += 'standard-eingabe'
} catch {
    Write-Warning "Standard-Eingabemethode konnte nicht gesetzt werden: $($_.Exception.Message)"
}

# 3. Das Layout zusaetzlich in DIESEN Prozess laden (KLF_SETFORPROCESS
#    wirkt nur hier, nicht in anderen Programmen). Fuer spaeter gestartete
#    Programme - und damit fuer den Tibia-Client - sorgt bereits die
#    Standard-Eingabemethode aus Schritt 2; neue Prozesse uebernehmen sie
#    ohne Ab-/Anmeldung.
try {
    $signatur = '[DllImport("user32.dll")] public static extern IntPtr LoadKeyboardLayout(string pwszKLID, uint Flags);'
    $user32 = Add-Type -MemberDefinition $signatur -Name 'KbLayout' -Namespace 'PilotNG' -PassThru -ErrorAction Stop
    # KLID 00000407 = de-DE; KLF_ACTIVATE(1) | KLF_SETFORPROCESS(0x100)
    $user32::LoadKeyboardLayout('00000407', 0x101) | Out-Null
} catch {
    Write-Warning "Layout konnte nicht in die Sitzung geladen werden: $($_.Exception.Message)"
}

$aktiv = Get-AktiverTag
$liste = Get-WinUserLanguageList
$hatDe = [bool]($liste | Where-Object { $_.LanguageTag -eq $ZielTag })
$standard = ''
try { $standard = Get-WinDefaultInputMethodOverride | Select-Object -ExpandProperty InputMethodTip } catch {}

[ordered]@{
    ok = $hatDe
    aktiv = $aktiv
    deVorhanden = $hatDe
    standardEingabe = $standard
    geaendert = $geaendert
} | ConvertTo-Json -Compress

if (-not $hatDe) { exit 1 }
