Core/Public/Radio/Set-RadioState.ps1

function Set-RadioState {
    [CmdletBinding()]
    param (       
        [Parameter(Mandatory = $true)]
        [ValidateSet("On", "Off")]
        [string]$State,
        [Parameter()]
        [string]$Name,
        [Parameter()]
        [int]$Index,
        [Parameter(ValueFromPipeline = $true)]
        [Windows.Devices.Radios.Radio]$InputObject
    )

    process {
        $EnumState = [Windows.Devices.Radios.RadioState]::$State
        $TargetRadios = @()

        # 1. Prioriteit: Direct object uit de pipeline
        if ($null -ne $InputObject) {
            $TargetRadios = @($InputObject)
        } else {
            # 2. Haal alle radio's op voor filtering
            $AllRadios = @(Get-RadioState)
            
            # Filter op Naam (als opgegeven)
            if (-not [string]::IsNullOrWhiteSpace($Name)) {
                $TargetRadios = $AllRadios | Where-Object { $_.Name -like "*$Name*" }
            } else {
                $TargetRadios = $AllRadios
            }

            # 3. Limiteer op Index (als opgegeven)
            if ($PSBoundParameters.ContainsKey('Index')) {
                if ($Index -lt $TargetRadios.Count) {
                    $TargetRadios = @($TargetRadios[$Index])
                } else {
                    Write-Error "Index $Index buiten bereik van de (gefilterde) selectie."
                    return
                }
            }
        }

        # 4. Voer de actie uit
        foreach ($Radio in $TargetRadios) {
            $AsyncOp = $Radio.SetStateAsync($EnumState)
            while ($AsyncOp.Status -eq [Windows.Foundation.AsyncStatus]::Started) {
                Start-Sleep -Milliseconds 50
            }
            
            $Status = $AsyncOp.GetResults()
            if ($Status -eq 'Allowed') {
                Write-Host "SUCCES: $($Radio.Name) staat nu $State" -ForegroundColor Green
            } else {
                Write-Warning "MISLUKT: $($Radio.Name) geeft status $Status"
            }
        }
    }
}

$RadioNameCompleter = {
    param($CommandName, $ParameterName, $WordToComplete, $CommandAst, $FakeBoundParameters)

    # Gebruik je eigen functie om de huidige radio's op te halen
    # We vangen eventuele fouten op voor het geval de DLL's nog niet geladen zijn
    try {
        $Radios = @(Get-RadioState)
        $Radios.Name | Where-Object { $_ -like "$WordToComplete*" } | ForEach-Object {
            [System.Management.Automation.CompletionResult]::new($_, $_, 'ParameterValue', $_)
        }
    } catch {
        # Geen actie bij fout, dan simpelweg geen suggesties
    }
}

Register-ArgumentCompleter -CommandName 'Set-RadioState' -ParameterName 'Name' -ScriptBlock $RadioNameCompleter

$RadioIndexCompleter = {
    param($CommandName, $ParameterName, $WordToComplete, $CommandAst, $FakeBoundParameters)

    try {
        # 1. Haal alle radio's op
        $Radios = @(Get-RadioState)
        
        # 2. Kijk of de 'Name' parameter al is ingevuld door de gebruiker
        if ($FakeBoundParameters.ContainsKey('Name')) {
            $Filter = $FakeBoundParameters['Name']
            $Radios = $Radios | Where-Object { $_.Name -like "*$Filter*" }
        }

        # 3. Genereer index-suggesties (0, 1, 2...) met de naam van de radio als tooltip
        for ($i = 0; $i -lt $Radios.Count; $i++) {
            $CompletionText = $i.ToString()
            $ListItemText = "$i ($($Radios[$i].Name))" # Wat je ziet in de lijst
            $ToolTip = "Selecteer index $($i): $($Radios[$i].Name)"
            
            [System.Management.Automation.CompletionResult]::new($CompletionText, $ListItemText, 'ParameterValue', $ToolTip)
        }
    } catch {
        # Geen actie bij fout
    }
}

Register-ArgumentCompleter -CommandName 'Set-RadioState' -ParameterName 'Index' -ScriptBlock $RadioIndexCompleter