functions/public/Remove-KlippyPrinter.ps1

function Remove-KlippyPrinter {
    <#
    .SYNOPSIS
        Removes a Klipper printer from the local registry.

    .DESCRIPTION
        Removes a registered printer configuration from the KlippyCLI registry.
        Supports confirmation prompts and pipeline input.

    .PARAMETER Id
        The unique identifier of the printer to remove.

    .PARAMETER PrinterName
        The friendly name of the printer to remove.

    .PARAMETER InputObject
        A printer object from pipeline input.

    .PARAMETER Force
        Suppress confirmation prompt.

    .EXAMPLE
        Remove-KlippyPrinter -PrinterName "OldPrinter"
        Removes the printer named "OldPrinter" with confirmation.

    .EXAMPLE
        Remove-KlippyPrinter -PrinterName "OldPrinter" -Force
        Removes the printer without confirmation.

    .EXAMPLE
        Get-KlippyPrinter | Where-Object { $_.PrinterName -like "Test*" } | Remove-KlippyPrinter -Force
        Removes all printers with names starting with "Test".

    .OUTPUTS
        None
    #>

    [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High', DefaultParameterSetName = 'ByName')]
    param(
        [Parameter(Mandatory = $true, ParameterSetName = 'ById')]
        [ValidateNotNullOrEmpty()]
        [string]$Id,

        [Parameter(Mandatory = $true, ParameterSetName = 'ByName', Position = 0)]
        [ValidateNotNullOrEmpty()]
        [string]$PrinterName,

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

        [Parameter()]
        [switch]$Force
    )

    begin {
        $printers = Read-KlippyPrinterRegistry
        $printersToRemove = [System.Collections.Generic.List[string]]::new()
    }

    process {
        # Resolve target printer
        $resolveParams = @{ Printers = $printers }
        switch ($PSCmdlet.ParameterSetName) {
            'ById' { $resolveParams['Id'] = $Id }
            'ByName' { $resolveParams['PrinterName'] = $PrinterName }
            'ByObject' { $resolveParams['InputObject'] = $InputObject }
        }

        try {
            $targetPrinter = Resolve-KlippyPrinterTarget @resolveParams
        }
        catch {
            Write-Error $_
            return
        }

        $confirmMessage = "Remove printer '$($targetPrinter.PrinterName)' ($($targetPrinter.Uri))?"

        if ($Force -or $PSCmdlet.ShouldProcess($targetPrinter.PrinterName, "Remove printer")) {
            if (-not $Force -and -not $PSCmdlet.ShouldContinue($confirmMessage, "Confirm Removal")) {
                return
            }

            $printersToRemove.Add($targetPrinter.Id)
            Write-Verbose "Marked printer '$($targetPrinter.PrinterName)' for removal."
        }
    }

    end {
        if ($printersToRemove.Count -eq 0) {
            return
        }

        # Remove printers from collection
        $removedDefault = $false
        foreach ($printerId in $printersToRemove) {
            $printerToRemove = $printers | Where-Object { $_.Id -eq $printerId }
            if ($printerToRemove) {
                if ($printerToRemove.IsDefault) {
                    $removedDefault = $true
                }
                $printers.Remove($printerToRemove) | Out-Null
                Write-Verbose "Removed printer '$($printerToRemove.PrinterName)'."
            }
        }

        # If we removed the default printer, set a new default
        if ($removedDefault -and $printers.Count -gt 0) {
            $printers[0].IsDefault = $true
            $printers[0].ModifiedAt = [datetime]::UtcNow
            Write-Warning "Default printer was removed. '$($printers[0].PrinterName)' is now the default."
        }

        # Save updated registry
        Write-KlippyPrinterRegistry -Printers $printers

        Write-Verbose "Registry updated. $($printersToRemove.Count) printer(s) removed."
    }
}