Public/System/Get-VergeSystemSetting.ps1

function Get-VergeSystemSetting {
    <#
    .SYNOPSIS
        Retrieves system settings from VergeOS.

    .DESCRIPTION
        Get-VergeSystemSetting retrieves one or more system settings from a VergeOS system.
        Settings are key-value pairs that control system behavior.

    .PARAMETER Key
        The key name of the setting to retrieve. Supports wildcards (* and ?).
        If not specified, all settings are returned.

    .PARAMETER Server
        The VergeOS connection to use. Defaults to the current default connection.

    .EXAMPLE
        Get-VergeSystemSetting

        Retrieves all system settings.

    .EXAMPLE
        Get-VergeSystemSetting -Key "ui_*"

        Retrieves all UI-related settings.

    .EXAMPLE
        Get-VergeSystemSetting -Key "max_connections"

        Retrieves the max_connections setting.

    .OUTPUTS
        PSCustomObject with PSTypeName 'Verge.SystemSetting'

    .NOTES
        System settings control various aspects of VergeOS behavior.
    #>

    [CmdletBinding()]
    [OutputType([PSCustomObject])]
    param(
        [Parameter(Position = 0)]
        [SupportsWildcards()]
        [string]$Key,

        [Parameter()]
        [object]$Server
    )

    begin {
        # Resolve connection
        if (-not $Server) {
            $Server = $script:DefaultConnection
        }
        if (-not $Server) {
            throw [System.InvalidOperationException]::new(
                'Not connected to VergeOS. Use Connect-VergeOS to establish a connection.'
            )
        }
    }

    process {
        try {
            Write-Verbose "Querying system settings from $($Server.Server)"

            # Build query parameters
            $queryParams = @{}
            $filters = [System.Collections.Generic.List[string]]::new()

            # Filter by key
            if ($Key) {
                if ($Key -match '[\*\?]') {
                    $searchTerm = $Key -replace '[\*\?]', ''
                    if ($searchTerm) {
                        $filters.Add("key ct '$searchTerm'")
                    }
                }
                else {
                    $filters.Add("key eq '$Key'")
                }
            }

            # Apply filters
            if ($filters.Count -gt 0) {
                $queryParams['filter'] = $filters -join ' and '
            }

            # Request fields (note: settings uses 'key' as the keyfield, so $key is the string key)
            $queryParams['fields'] = @(
                'key'
                'value'
                'default_value'
                'description'
            ) -join ','

            $response = Invoke-VergeAPI -Method GET -Endpoint 'settings' -Query $queryParams -Connection $Server

            # Handle both single object and array responses
            $settings = if ($response -is [array]) { $response } else { @($response) }

            foreach ($setting in $settings) {
                # Skip null entries
                if (-not $setting -or -not $setting.key) {
                    continue
                }

                # Create output object
                $output = [PSCustomObject]@{
                    PSTypeName    = 'Verge.SystemSetting'
                    Key           = $setting.key
                    Value         = $setting.value
                    DefaultValue  = $setting.default_value
                    Description   = $setting.description
                    IsModified    = ($setting.value -ne $setting.default_value)
                }

                # Add hidden properties for pipeline support
                $output | Add-Member -MemberType NoteProperty -Name '_Connection' -Value $Server -Force

                Write-Output $output
            }
        }
        catch {
            $PSCmdlet.ThrowTerminatingError($_)
        }
    }
}