functions/public/Remove-KlippyPrintHistory.ps1

function Remove-KlippyPrintHistory {
    <#
    .SYNOPSIS
        Removes print history entries from a Klipper printer.

    .DESCRIPTION
        Deletes print history records. Can delete specific jobs by ID,
        all history, or entries before a specific time.

    .PARAMETER Id
        The unique identifier of the printer.

    .PARAMETER PrinterName
        The friendly name of the printer.

    .PARAMETER InputObject
        A printer object from pipeline input.

    .PARAMETER JobId
        The specific job ID(s) to delete.

    .PARAMETER All
        Delete all print history.

    .PARAMETER Before
        Delete entries before this Unix timestamp.

    .PARAMETER Force
        Skip confirmation prompt.

    .EXAMPLE
        Remove-KlippyPrintHistory -JobId "000001"
        Removes a specific print history entry.

    .EXAMPLE
        Remove-KlippyPrintHistory -All -Force
        Removes all print history without confirmation.

    .EXAMPLE
        Get-KlippyPrintHistory | Where-Object Status -eq 'cancelled' | Remove-KlippyPrintHistory
        Removes all cancelled print entries.

    .OUTPUTS
        None.
    #>

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

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

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

        [Parameter(Mandatory = $true, ParameterSetName = 'ById')]
        [Parameter(Mandatory = $true, ParameterSetName = 'ByName')]
        [Parameter(ParameterSetName = 'ByObject', ValueFromPipelineByPropertyName = $true)]
        [string[]]$JobId,

        [Parameter(Mandatory = $true, ParameterSetName = 'ByIdAll')]
        [Parameter(Mandatory = $true, ParameterSetName = 'ByNameAll')]
        [Parameter(Mandatory = $true, ParameterSetName = 'ByObjectAll')]
        [switch]$All,

        [Parameter()]
        [long]$Before,

        [Parameter()]
        [switch]$Force
    )

    begin {
        $jobsToDelete = [System.Collections.Generic.List[string]]::new()
        $printer = $null
    }

    process {
        # Resolve printer
        $resolveParams = @{}
        if ($Id) { $resolveParams['Id'] = $Id }
        elseif ($PrinterName) { $resolveParams['PrinterName'] = $PrinterName }
        elseif ($InputObject) {
            if ($InputObject.PSTypeName -eq 'KlippyCLI.PrintHistory') {
                $resolveParams['Id'] = $InputObject.PrinterId
                if ($InputObject.JobId -and -not $All) {
                    $jobsToDelete.Add($InputObject.JobId)
                }
            }
            else {
                $resolveParams['InputObject'] = $InputObject
            }
        }

        if (-not $printer) {
            $printer = Resolve-KlippyPrinterTarget @resolveParams
        }

        # Collect job IDs from parameter
        if ($JobId) {
            foreach ($jid in $JobId) {
                $jobsToDelete.Add($jid)
            }
        }
    }

    end {
        if (-not $printer) {
            Write-Error "No printer specified."
            return
        }

        try {
            if ($All) {
                $action = "Delete ALL print history"
                if ($Force -or $PSCmdlet.ShouldProcess($printer.PrinterName, $action)) {
                    $endpoint = "server/history/delete_all"
                    $null = Invoke-KlippyJsonRpc -Printer $printer -Method $endpoint
                    Write-Host "All print history deleted from '$($printer.PrinterName)'." -ForegroundColor Green
                }
            }
            elseif ($jobsToDelete.Count -gt 0) {
                $action = "Delete $($jobsToDelete.Count) print history entry(s)"
                if ($Force -or $PSCmdlet.ShouldProcess($printer.PrinterName, $action)) {
                    foreach ($jid in $jobsToDelete) {
                        $endpoint = "server/history/delete_job?uid=$jid"
                        $null = Invoke-KlippyJsonRpc -Printer $printer -Method $endpoint
                        Write-Verbose "Deleted job: $jid"
                    }
                    Write-Host "Deleted $($jobsToDelete.Count) print history entry(s)." -ForegroundColor Green
                }
            }
            else {
                Write-Warning "No jobs specified to delete. Use -JobId or -All."
            }
        }
        catch {
            Write-Error "Failed to delete print history from '$($printer.PrinterName)': $_"
        }
    }
}