param(
    [Parameter(Mandatory = $true)][string]$DeviceName,
    [Parameter(Mandatory = $true)][string]$PnpDeviceId
)

# Manuelle Vorgabe schlaegt alles.
$configured = [Environment]::GetEnvironmentVariable('TIBIAPILOT_ARDUINO_FQBN', 'User')
if ($configured) { Write-Output $configured; exit 0 }

# Windows benennt 32u4-Boards oft nur "Serielles USB-Geraet (COMx)",
# darum zuerst ueber VID/PID gehen - das ist eindeutig - und den
# Geraetenamen nur als Rueckfallebene nutzen.
$vendorId = [regex]::Match($PnpDeviceId, 'VID_([0-9A-Fa-f]{4})').Groups[1].Value.ToUpper()
$productId = [regex]::Match($PnpDeviceId, 'PID_([0-9A-Fa-f]{4})').Groups[1].Value.ToUpper()

# Traegt das Board bereits die getarnte Kennung, laesst sich das Modell
# nicht mehr daraus ablesen - die Kennung gehoert ja absichtlich nicht
# mehr zu Arduino. Dann gilt das beim letzten Flashen gemerkte Modell.
$repo = Join-Path $env:USERPROFILE 'TibiaPilotNG'
$identitaetsDatei = Join-Path $repo 'arduino\usb-identity.json'
if (Test-Path $identitaetsDatei) {
    $getarnt = ((Get-Content $identitaetsDatei -Raw | ConvertFrom-Json).vid -replace '^0x', '').ToUpper()
    if ($vendorId -eq $getarnt) {
        $gemerkt = [Environment]::GetEnvironmentVariable('TIBIAPILOT_ARDUINO_LAST_FQBN', 'User')
        Write-Output $(if ($gemerkt) { $gemerkt } else { 'arduino:avr:leonardo' })
        exit 0
    }
}

# Offizielle Arduino-Boards: die fuehrende 8 heisst nur "Anwendung
# statt Bootloader", das Modell steckt in den letzten drei Stellen.
if ($vendorId -in @('2341', '2A03')) {
    switch -Regex ($productId) {
        '^[08]036$' { Write-Output 'arduino:avr:leonardo'; exit 0 }
        '^[08]037$' { Write-Output 'arduino:avr:micro'; exit 0 }
        '^[08]03C$' { Write-Output 'arduino:avr:esplora'; exit 0 }
        '^[08]038$' { Write-Output 'arduino:avr:leonardo'; exit 0 }
    }
}
# SparkFun Pro Micro: PID sagt den Takt.
if ($vendorId -eq '1B4F') {
    switch -Regex ($productId) {
        '^920[34]$' { Write-Output 'SparkFun:avr:promicro:cpu=8MHzatmega32U4'; exit 0 }
        '^920[56]$' { Write-Output 'SparkFun:avr:promicro:cpu=16MHzatmega32U4'; exit 0 }
    }
}
# Adafruit Feather 32u4.
if ($vendorId -eq '239A' -and $productId -match '^[08]00C$') {
    Write-Output 'adafruit:avr:feather32u4'; exit 0
}

# Rueckfallebene: Klartext im Geraetenamen (wenn ein Hersteller-Treiber
# installiert ist).
if ($DeviceName -match 'Leonardo') { Write-Output 'arduino:avr:leonardo'; exit 0 }
if ($DeviceName -match 'Arduino Micro') { Write-Output 'arduino:avr:micro'; exit 0 }
if ($DeviceName -match 'Pro Micro') {
    Write-Output 'SparkFun:avr:promicro:cpu=16MHzatmega32U4'; exit 0
}

throw ("32u4 erkannt (VID_$vendorId PID_$productId), aber das Modell ist unbekannt. " +
    "Setze die Umgebungsvariable TIBIAPILOT_ARDUINO_FQBN, " +
    "z. B. auf arduino:avr:leonardo.")
