Public/Invoke-UnifiCli.ps1

function Invoke-UnifiCli {
    [CmdletBinding()]
    param(
        [Parameter(Position = 0)]
        [string]$Command,

        [Parameter(Position = 1, ValueFromRemainingArguments)]
        [string[]]$Arguments
    )

    switch ($Command.ToLower()) {

        'connect' {
            if (-not $Arguments -or $Arguments.Count -eq 0) {
                Write-Error "Usage: unifi-cli connect <host> [--port <n>] [--insecure] [--save]"
                return
            }
            $p = @{ Controller = $Arguments[0] }
            for ($i = 1; $i -lt $Arguments.Count; $i++) {
                switch ($Arguments[$i]) {
                    '--insecure' { $p.SkipCertificateCheck = $true }
                    '--save'     { $p.Save = $true }
                    '--port'     { $p.Port = [int]$Arguments[++$i] }
                    '--totp'     { $p.Token = $Arguments[++$i] }
                }
            }
            Connect-UnifiController @p
        }

        'disconnect' {
            Disconnect-UnifiController
        }

        'status' {
            Get-UnifiConnectionStatus
        }

        'use' {
            $noun = if ($Arguments.Count -gt 0) { $Arguments[0].ToLower() } else { '' }
            switch ($noun) {
                'site' {
                    if ($Arguments.Count -lt 2) {
                        Write-Error "Usage: unifi-cli use site <id> (get IDs from: unifi-cli list sites)"
                        return
                    }
                    $p = @{ Site = $Arguments[1] }
                    if ($Arguments -contains '--save') { $p.Save = $true }
                    Set-UnifiDefaultSite @p
                }
                default { Write-Warning "Unknown: unifi-cli use $noun. Try: unifi-cli use site <id>" }
            }
        }

        'set' {
            $noun = if ($Arguments.Count -gt 0) { $Arguments[0].ToLower() } else { '' }
            switch ($noun) {
                'wlan-password' {
                    $p = @{}
                    for ($i = 1; $i -lt $Arguments.Count; $i++) {
                        switch ($Arguments[$i]) {
                            '--ssid' { $p.Ssid = $Arguments[++$i] }
                            '--site' { $p.Site = $Arguments[++$i] }
                        }
                    }
                    if (-not $p.Ssid) {
                        Write-Error "Usage: unifi-cli set wlan-password --ssid <name> [--site <id>]"
                        return
                    }
                    Set-UnifiWlanPassword @p
                }
                default { Write-Warning "Unknown: unifi-cli set $noun. Try: unifi-cli set wlan-password --ssid <name>" }
            }
        }

        { $_ -in 'list', 'get', 'show' } {
            $target = if ($Arguments.Count -gt 0) { $Arguments[0].ToLower() } else { '' }

            # Parse shared flags: --site <id>, --active, --show-password
            $p = @{}
            for ($i = 1; $i -lt $Arguments.Count; $i++) {
                switch ($Arguments[$i]) {
                    '--site'          { $p.Site = $Arguments[++$i] }
                    '--active'        { $p.Active = $true }
                    '--show-password' { $p.ShowPassword = $true }
                    '--ssid'          { $p.Ssid = $Arguments[++$i] }
                }
            }

            switch ($target) {
                'sites'   { Get-UnifiSite }
                'devices' { Get-UnifiDevice @p }
                'clients' { Get-UnifiClient @p }
                'wlans'   { Get-UnifiWlan @p }
                default   {
                    Write-Warning "Unknown target '$target'. Available: sites, devices, clients, wlans"
                }
            }
        }

        default {
            Write-Host ""
            Write-Host "UnifiCLI — Unifi Network Controller CLI" -ForegroundColor Cyan
            Write-Host ""
            Write-Host " unifi-cli connect <host> [--port <n>] [--insecure] [--save] [--totp <code>]"
            Write-Host " unifi-cli disconnect"
            Write-Host " unifi-cli status"
            Write-Host " unifi-cli use site <id> [--save]"
            Write-Host " unifi-cli list sites"
            Write-Host " unifi-cli list devices [--site <id>]"
            Write-Host " unifi-cli list clients [--site <id>] [--active]"
            Write-Host " unifi-cli list wlans [--site <id>] [--ssid <name>] [--show-password]"
            Write-Host " unifi-cli set wlan-password --ssid <name> [--site <id>]"
            Write-Host ""
            Write-Host "Native PS functions: Connect-UnifiController, Get-UnifiSite, etc." -ForegroundColor DarkGray
            Write-Host ""
        }
    }
}