functions/public/Get-KlippyBedMesh.ps1

function Get-KlippyBedMesh {
    <#
    .SYNOPSIS
        Gets bed mesh data from a Klipper printer.

    .DESCRIPTION
        Retrieves the bed mesh profiles and current mesh data including
        probed points, mesh matrix, and profile information.

    .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 ProfileName
        Get a specific mesh profile by name.

    .PARAMETER ListProfiles
        List available mesh profile names only.

    .EXAMPLE
        Get-KlippyBedMesh
        Gets the current bed mesh from the default printer.

    .EXAMPLE
        Get-KlippyBedMesh -PrinterName "voronv2" -ListProfiles
        Lists available mesh profiles.

    .EXAMPLE
        Get-KlippyBedMesh -ProfileName "default"
        Gets the "default" mesh profile data.

    .OUTPUTS
        KlippyCLI.BedMesh object.
    #>

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

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

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

        [Parameter()]
        [string]$ProfileName,

        [Parameter(ParameterSetName = 'ListById')]
        [Parameter(ParameterSetName = 'ListByName')]
        [Parameter(ParameterSetName = 'ListByObject')]
        [switch]$ListProfiles
    )

    process {
        # Resolve printer
        $resolveParams = @{}
        if ($Id) { $resolveParams['Id'] = $Id }
        elseif ($PrinterName) { $resolveParams['PrinterName'] = $PrinterName }
        elseif ($InputObject) { $resolveParams['InputObject'] = $InputObject }

        $printer = Resolve-KlippyPrinterTarget @resolveParams

        try {
            $endpoint = "printer/objects/query?bed_mesh"
            $response = Invoke-KlippyJsonRpc -Printer $printer -Method $endpoint -NoNormalize

            $data = $response.status.bed_mesh
            if (-not $data) {
                Write-Warning "Bed mesh data not available. Is bed_mesh configured?"
                return
            }

            # List profiles only
            if ($ListProfiles) {
                $profiles = @()
                if ($data.profiles) {
                    $profiles = $data.profiles.PSObject.Properties.Name
                }
                return [PSCustomObject]@{
                    PSTypeName     = 'KlippyCLI.BedMeshProfiles'
                    PrinterId      = $printer.Id
                    PrinterName    = $printer.PrinterName
                    Profiles       = $profiles
                    CurrentProfile = $data.profile_name
                }
            }

            # Get specific profile or current mesh
            $meshData = $data
            if ($ProfileName -and $data.profiles.$ProfileName) {
                $meshData = $data.profiles.$ProfileName
            }

            $result = [PSCustomObject]@{
                PSTypeName      = 'KlippyCLI.BedMesh'
                PrinterId       = $printer.Id
                PrinterName     = $printer.PrinterName
                ProfileName     = $data.profile_name
                MeshMin         = $data.mesh_min
                MeshMax         = $data.mesh_max
                ProbedMatrix    = $data.probed_matrix
                MeshMatrix      = $data.mesh_matrix
            }

            # Add profile-specific data if available
            if ($meshData.points) {
                $result | Add-Member -NotePropertyName 'Points' -NotePropertyValue $meshData.points -Force
            }

            $result
        }
        catch {
            Write-Error "Failed to get bed mesh from '$($printer.PrinterName)': $_"
        }
    }
}