functions/private/Resolve-KlippyPrinterTarget.ps1

function Resolve-KlippyPrinterTarget {
    <#
    .SYNOPSIS
        Resolves a printer target from various input methods.

    .DESCRIPTION
        Resolves a printer from the registry using Id, PrinterName, or pipeline input.
        Returns the default printer if no parameters are specified.
        Errors on ambiguous matches.

    .PARAMETER Id
        The unique identifier (GUID) of the printer.

    .PARAMETER PrinterName
        The friendly name of the printer.

    .PARAMETER InputObject
        A printer object from pipeline input.

    .PARAMETER Printers
        Optional pre-loaded printer collection to search. If not provided, reads from registry.

    .OUTPUTS
        PSCustomObject - The resolved printer object.
    #>

    [CmdletBinding(DefaultParameterSetName = 'Default')]
    [OutputType([PSCustomObject])]
    param(
        [Parameter(ParameterSetName = 'ById')]
        [ValidateNotNullOrEmpty()]
        [string]$Id,

        [Parameter(ParameterSetName = 'ByName')]
        [ValidateNotNullOrEmpty()]
        [string]$PrinterName,

        [Parameter(ParameterSetName = 'ByObject', ValueFromPipeline = $true)]
        [PSCustomObject]$InputObject,

        [Parameter()]
        [System.Collections.Generic.List[PSCustomObject]]$Printers
    )

    process {
        # Load printers if not provided
        if (-not $Printers) {
            $Printers = Read-KlippyPrinterRegistry
        }

        if ($Printers.Count -eq 0) {
            throw "No printers configured. Use Add-KlippyPrinter to add a printer first."
        }

        # Resolve based on parameter set
        switch ($PSCmdlet.ParameterSetName) {
            'ById' {
                $resolved = $Printers | Where-Object { $_.Id -eq $Id }
                if (-not $resolved) {
                    throw "Printer with Id '$Id' not found."
                }
                return $resolved
            }

            'ByName' {
                # Case-insensitive match
                $resolved = $Printers | Where-Object { $_.PrinterName -eq $PrinterName }
                if (-not $resolved) {
                    # Try case-insensitive
                    $resolved = $Printers | Where-Object { $_.PrinterName -ieq $PrinterName }
                }

                if (-not $resolved) {
                    throw "Printer with name '$PrinterName' not found."
                }

                # Check for ambiguity (shouldn't happen due to uniqueness constraint, but be safe)
                if ($resolved -is [System.Array] -and $resolved.Count -gt 1) {
                    throw "Ambiguous printer name '$PrinterName' matched multiple printers."
                }

                return $resolved
            }

            'ByObject' {
                if ($null -eq $InputObject) {
                    throw "Pipeline input object is null."
                }

                # Validate the input object has required properties
                if (-not $InputObject.Id) {
                    throw "Pipeline input object must have an 'Id' property."
                }

                # Verify the printer exists in registry
                $resolved = $Printers | Where-Object { $_.Id -eq $InputObject.Id }
                if (-not $resolved) {
                    throw "Printer with Id '$($InputObject.Id)' from pipeline not found in registry."
                }

                return $resolved
            }

            'Default' {
                # Return default printer
                $defaultPrinter = $Printers | Where-Object { $_.IsDefault -eq $true }

                if (-not $defaultPrinter) {
                    # If no default set, return the first printer if only one exists
                    if ($Printers.Count -eq 1) {
                        Write-Verbose "No default printer set, using only configured printer."
                        return $Printers[0]
                    }

                    throw "No default printer configured and multiple printers exist. Specify -Id or -PrinterName, or set a default printer."
                }

                return $defaultPrinter
            }
        }
    }
}