Private/ArgumentCompleters7.ps1

$ScriptBlockSetRadioStateIndexPS7 = {
    param($CommandName, $ParameterName, $WordToComplete)
    # 1. Zoek de sessie (blijf proberen zolang de gebruiker tapt)
    #$Session = Get-PSSession | Where-Object { $_.ConfigurationName -like "*WinPS*" -or $_.Name -like "*WinPS*" } | Select-Object -First 1
    while ($script:MyWiFiSession.State -ne 'Opened') { Start-Sleep -Seconds 1 }
    # 2. Check of de sessie 'Opened' is EN of onze functie al bestaat
    if ($script:MyWiFiSession -and $script:MyWiFiSession.State -eq 'Opened') {
        $RadioData = Invoke-Command -Session $script:MyWiFiSession -ScriptBlock { 
            # Check of de functie al geladen is in de 5.1 sessie
            if (Get-Command Get-RadioState -ErrorAction SilentlyContinue) {
                $i = 0
                Get-RadioState | ForEach-Object { "$i|$($_.Name)"; $i++ }
            }
        } -ErrorAction SilentlyContinue
        if ($RadioData) {
            foreach ($Line in $RadioData) {
                $Parts = $Line.Split('|')
                if ($Parts[0] -like "$WordToComplete*") {
                    [System.Management.Automation.CompletionResult]::new($Parts[0], "$($Parts[0]): $($Parts[1])", 'ParameterValue', $Parts[1])
                }
            }
        }
    }
}
$ScriptBlockSetRadioStateSetStatePS7 = {
    param($CommandName, $ParameterName, $WordToComplete)
    # We definiëren de opties als een lijst van objecten voor makkelijke verwerking
    $States = @(
        @{ Value = 'On'; Alias = '1'; Tooltip = 'Zet de radio aan' },
        @{ Value = 'Off'; Alias = '0'; Tooltip = 'Zet de radio uit' }
    )
    foreach ($S in $States) {
        # Check of wat de gebruiker typt matcht met de Naam OF de numerieke Alias
        if ($S.Value -like "$WordToComplete*" -or $S.Alias -like "$WordToComplete*") {
            [System.Management.Automation.CompletionResult]::new(
                $S.Value,                       # De tekst die daadwerkelijk wordt ingevuld (On/Off)
                "$($S.Alias): $($S.Value)",     # Wat de gebruiker ziet in het menu (1: On)
                'ParameterValue', 
                $S.Tooltip                      # Extra info bij selectie
            )
        }
    }
}

$ScriptBlockConnectWifiNetworkWifiReconnectionKindPS7 = {
    param($CommandName, $ParameterName, $WordToComplete)
    
    $States = @(
        @{ Value = 'Automatic'; Alias = '0'; Tooltip = 'Connects automatically when in range.' },
        @{ Value = 'Manual'; Alias = '1'; Tooltip = 'User must connect manually.' }
    )

    $CompletionResults = New-Object System.Collections.Generic.List[System.Management.Automation.CompletionResult]
    foreach ($S in $States) {
        if ($S.Value -like "$WordToComplete*" -or $S.Alias -like "$WordToComplete*") {
            $CompletionResults.Add([System.Management.Automation.CompletionResult]::new(
                    $S.Value, 
                    "$($S.Alias): $($S.Value)", 
                    'ParameterValue', 
                    $S.Tooltip
                ))
        }
    }
    return $CompletionResults
}



$ScriptBlockArgumentCompleterSsidPS7 = {
    param ($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameters)

    # 1. Directe Exit bij Hidden
    if ($fakeBoundParameters.ContainsKey('Hidden')) {
        return [System.Management.Automation.CompletionResult]::new(" ", "SSID Unknown (Hidden Mode)", 'Text', "With a hidden network you need to enter the SSID manually")
    }

    #$Session = Get-PSSession | Where-Object { $_.ConfigurationName -like "*WinPS*" -or $_.Name -like "*WinPS*" } | Select-Object -First 1
    while ($script:MyWiFiSession.State -ne 'Opened') { Start-Sleep -Seconds 1 }

    # 2. Haal WiFi data op via PowerShell 5.1 (onder water)
    # We vangen de output op als JSON om de objectstructuur te behouden in PS 7
    $allNetworks = Invoke-Command -session $script:MyWiFiSession -ScriptBlock {
        if (Get-Command Search-WifiNetworksPrivate -ErrorAction SilentlyContinue) {
            Search-WifiNetworksPrivate | Select-Object Ssid, Bssid, NetworkRssiInDecibelMilliwatts, SignalBars 
        }
    } -ErrorAction SilentlyContinue

    # 3. Filtering op BSSID (indien meegegeven)
    $givenBssid = $fakeBoundParameters['Bssid']
    if ($givenBssid) {
        $cleanGiven = $givenBssid -replace '[^0-9A-Fa-f]'
        $allNetworks = $allNetworks | Where-Object { 
            ($_.Bssid -replace '[^0-9A-Fa-f]') -eq $cleanGiven 
        }
    }

    # 4. Bouw de lijst voor de Tab-completion
    $allNetworks | Where-Object { ![string]::IsNullOrWhiteSpace($_.Ssid) } |
    Group-Object Ssid | ForEach-Object { $_.Group | Sort-Object NetworkRssiInDecibelMilliwatts -Descending | Select-Object -First 1 }  | Sort-Object NetworkRssiInDecibelMilliwatts -Descending | 
    ForEach-Object {        
        $strongest = $_
        # Voeg quotes toe als er spaties in de SSID zitten
        $ssidValue = if ($strongest.Ssid -match ' ') { "`"$($strongest.Ssid)`"" } else { $strongest.Ssid }
        $displayText = "$($strongest.Ssid) ($($strongest.SignalBars * 20)% / $($strongest.NetworkRssiInDecibelMilliwatts) dBm)"
        
        if ($strongest.Ssid -like "$wordToComplete*") {
            [System.Management.Automation.CompletionResult]::new($ssidValue, $displayText, 'ParameterValue', "BSSID: $($strongest.Bssid)")
        }
    }
}

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

    # 1. Connection Guard: Wait for the WinPS session to be ready
    while ($script:MyWiFiSession.State -ne 'Opened') { Start-Sleep -Milliseconds 100 }

    # 2. Fetch WiFi data via the existing PowerShell 5.1 Session
    # Using Invoke-Command to bridge the gap to WinPS
    $AvailableNetworks = Invoke-Command -Session $script:MyWiFiSession -ScriptBlock {
        if (Get-Command Search-WifiNetworksPrivate -ErrorAction SilentlyContinue) {
            # Return raw data for processing in PS7
            Search-WifiNetworksPrivate | Select-Object Ssid, Bssid, NetworkRssiInDecibelMilliwatts, SignalBars, ChannelCenterFrequencyInKilohertz
        }
    } -ErrorAction SilentlyContinue

    if (-not $AvailableNetworks) { return }

    # 3. Context Filtering (Filter by SSID if provided in the command line)
    $FilterSsid = if ($FakeBoundParameters.ContainsKey('Ssid')) { $FakeBoundParameters['Ssid'] -replace '["'']', '' } else { $null }
    $ShowHidden = $FakeBoundParameters.ContainsKey('Hidden')

    $Results = New-Object System.Collections.Generic.List[System.Management.Automation.CompletionResult]

    foreach ($Net in ($AvailableNetworks | Sort-Object NetworkRssiInDecibelMilliwatts -Descending)) {
        $IsSsidEmpty = [string]::IsNullOrWhiteSpace($Net.Ssid)
        $HasSsidFilter = -not [string]::IsNullOrWhiteSpace($FilterSsid)

        # Logic: Determine if this BSSID should be shown based on SSID/Hidden parameters
        $IsMatch = switch ($true) {
            ($HasSsidFilter -and $ShowHidden) { $IsSsidEmpty; break }
            ($HasSsidFilter) { ($Net.Ssid -eq $FilterSsid); break }
            ($ShowHidden) { $IsSsidEmpty; break }
            default { (-not $IsSsidEmpty); break }
        }

        if ($IsMatch) {
            # Prepare Labels and Tooltips
            $Label = if ($IsSsidEmpty) { "$($Net.Bssid) [HIDDEN]" } else { "$($Net.Bssid) ($($Net.Ssid))" }
            $SignalPercent = "$($Net.SignalBars * 20)%"
            $Tooltip = "Signal: $SignalPercent ($($Net.NetworkRssiInDecibelMilliwatts) dBm)"

            # Filter by what the user has already typed ($WordToComplete)
            if ($Net.Bssid -like "$WordToComplete*") {
                $Results.Add([System.Management.Automation.CompletionResult]::new(
                        $Net.Bssid, 
                        $Label, 
                        'ParameterValue', 
                        $Tooltip
                    ))
            }
        }
    }

    # 4. Fallback: Prevent default CLI history help if no matches are found
    if ($Results.Count -eq 0) {
        $Results.Add([System.Management.Automation.CompletionResult]::new(" ", "No BSSID match in range", 'Text', "No network found matching current filters"))
    }

    return $Results


}

$null = $ScriptBlockSetRadioStateIndexPS7, `
    $ScriptBlockSetRadioStateSetStatePS7, `
    $ScriptBlockArgumentCompleterSsidPS7, `
    $ScriptBlockConnectWifiNetworkWifiReconnectionKindPS7, `
    $ScriptBlockArgumentCompleterBssidPS7