functions/public/Get-KlippyLogFile.ps1

function Get-KlippyLogFile {
    <#
    .SYNOPSIS
        Gets log files from a Klipper printer.

    .DESCRIPTION
        Lists log files available from the printer including Klipper logs,
        Moonraker logs, and other service logs.
        Supports wildcard filtering.

    .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 Path
        Path filter or pattern. Supports wildcards.

    .EXAMPLE
        Get-KlippyLogFile
        Lists all log files on the default printer.

    .EXAMPLE
        Get-KlippyLogFile -PrinterName "voronv2" -Path "klippy*"
        Lists Klipper log files.

    .EXAMPLE
        Get-KlippyLogFile -Path "*.log"
        Lists all .log files.

    .OUTPUTS
        PSCustomObject[] with log file information.
    #>

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

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

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

        [Parameter(Position = 0)]
        [string]$Path
    )

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

        $printer = Resolve-KlippyPrinterTarget @resolveParams

        try {
            Write-Verbose "[$($printer.PrinterName)] Fetching log file list..."

            # Get file listing from logs root
            $response = Invoke-KlippyHttpRequest -Printer $printer -Endpoint "server/files/list" -QueryParameters @{
                root = "logs"
            }

            # Filter to files only
            $fileList = $response | Where-Object { -not $_.Dirname }

            # Apply path filter if specified
            if ($Path) {
                $fileList = $fileList | Filter-KlippyItemByWildcard -Pattern $Path
            }

            # Transform to output objects
            $results = foreach ($file in $fileList) {
                $fileName = Split-Path $file.Path -Leaf

                # Determine log type based on filename
                $logType = switch -Regex ($fileName) {
                    '^klippy' { 'Klipper' }
                    '^moonraker' { 'Moonraker' }
                    '^crowsnest' { 'Crowsnest' }
                    '^webcamd' { 'Webcam' }
                    default { 'Other' }
                }

                [PSCustomObject]@{
                    PSTypeName  = 'KlippyCLI.LogFile'
                    PrinterId   = $printer.Id
                    PrinterName = $printer.PrinterName
                    Path        = $file.Path
                    Name        = $fileName
                    LogType     = $logType
                    Size        = $file.Size
                    SizeKB      = [Math]::Round($file.Size / 1KB, 2)
                    SizeMB      = [Math]::Round($file.Size / 1MB, 2)
                    Modified    = if ($file.Modified) { [DateTimeOffset]::FromUnixTimeSeconds([long]$file.Modified).LocalDateTime } else { $null }
                }
            }

            return $results
        }
        catch {
            Write-Error "[$($printer.PrinterName)] Failed to list log files: $_"
        }
    }
}