Private/ConvertTo-VergeFilter.ps1

function ConvertTo-VergeFilter {
    <#
    .SYNOPSIS
        Converts filter parameters to VergeOS API filter syntax.

    .DESCRIPTION
        Takes PowerShell-style filter parameters and converts them to the
        VergeOS API filter query string format.

    .PARAMETER Filters
        A hashtable of filter conditions.

    .EXAMPLE
        ConvertTo-VergeFilter -Filters @{ name = 'Web*'; status = 'running' }
        # Returns: "name like 'Web%' and status eq 'running'"

    .NOTES
        This is an internal function.
    #>

    [CmdletBinding()]
    [OutputType([string])]
    param(
        [Parameter(Mandatory)]
        [hashtable]$Filters
    )

    $filterParts = [System.Collections.Generic.List[string]]::new()

    foreach ($key in $Filters.Keys) {
        $value = $Filters[$key]

        if ($null -eq $value) {
            continue
        }

        # Handle wildcards - convert to LIKE query
        if ($value -is [string] -and $value -match '\*') {
            $likeValue = $value -replace '\*', '%'
            $filterParts.Add("$key like '$likeValue'")
        }
        # Handle arrays - convert to IN query
        elseif ($value -is [array]) {
            $inValues = ($value | ForEach-Object { "'$_'" }) -join ','
            $filterParts.Add("$key in ($inValues)")
        }
        # Handle booleans
        elseif ($value -is [bool]) {
            $boolValue = if ($value) { 'true' } else { 'false' }
            $filterParts.Add("$key eq $boolValue")
        }
        # Handle numbers
        elseif ($value -is [int] -or $value -is [long] -or $value -is [double]) {
            $filterParts.Add("$key eq $value")
        }
        # Handle strings
        else {
            $filterParts.Add("$key eq '$value'")
        }
    }

    if ($filterParts.Count -eq 0) {
        return $null
    }

    return $filterParts -join ' and '
}