Functions/Public/Get-WHDTicket.ps1

<#
    .SYNOPSIS
    Get a Ticket from WHD.
 
    .DESCRIPTION
    This function retrieves a specific Ticket from WHD, or a list of Tickets based on a provided search parameter.
 
    .PARAMETER ResourceId
    The id of the Ticket to be retrieved.
 
    .PARAMETER TicketListType
    A WHDTicketListType to filter the results.
    Required if no Qualifier, QualifierString, or Search options are provided.
 
    .PARAMETER Qualifier
    A WHDQualifier object to filter the results.
    Use New-WHDQualifier and Join-WHDQualifier to build these objects.
 
    .PARAMETER QualifierString
    A WHD API qualifier string to filter the results.
    This is an alternative to using the Qualifier parameter if you prefer to build the qualifier string manually.
 
    .PARAMETER Status
    A statustype.statusTypeName to search for.
 
    .PARAMETER Location
    A location.locationName to search for.
 
    .PARAMETER Expand
    If specified, list results will use the detailed format.
#>

function Get-WHDTicket {
    [CmdletBinding(DefaultParameterSetName = "Search")]
    param (
        [Parameter(ParameterSetName = "Single", Mandatory, Position = 0)]
        [int] $ResourceId,

        [Parameter(ParameterSetName = "Qualifier")]
        [Parameter(ParameterSetName = "QualifierString")]
        [Parameter(ParameterSetName = "Search")]
        [WHDTicketListType] $TicketListType,

        [Parameter(ParameterSetName = "Qualifier", Mandatory)]
        [WHDQualifier] $Qualifier,

        [Parameter(ParameterSetName = "QualifierString", Mandatory)]
        [string] $QualifierString,

        [Parameter(ParameterSetName = "Search")]
        [string] $Status,

        [Parameter(ParameterSetName = "Search")]
        [string] $Location,

        [Parameter(ParameterSetName = "Search")]
        [Parameter(ParameterSetName = "Qualifier")]
        [Parameter(ParameterSetName = "QualifierString")]
        [switch] $Expand
    )

    $AttributeMap = @{
        Status   = "statustype.statusTypeName"
        Location = "location.locationName"
    }

    $QueryParameters = @{
        ResourceType = [WHDResourceType]::Tickets
        Expand       = $Expand.IsPresent
    }

    if ($PSBoundParameters.ContainsKey("TicketListType")) {
        $QueryParameters["TicketListType"] = $TicketListType
    }

    switch ($PSCmdlet.ParameterSetName) {
        "Single" {
            $QueryParameters["ResourceId"] = $ResourceId
        }
        "Qualifier" {
            $QueryParameters["Qualifier"] = $Qualifier
        }
        "QualifierString" {
            $QueryParameters["QualifierString"] = $QualifierString
        }
        "Search" {
            $QueryParameters["Qualifier"] = ConvertTo-WHDQualifier `
                -BoundParameters $PSBoundParameters `
                -AttributeMap $AttributeMap
        }
    }

    if (
        ($PSCmdlet.ParameterSetName -ne "Single") -and
        ($null -eq $QueryParameters["Qualifier"]) -and
        [string]::IsNullOrWhiteSpace($QueryParameters["QualifierString"]) -and
        (-not $PSBoundParameters.ContainsKey("TicketListType"))
    ) {
        throw "TicketListType is required when no Qualifier, QualifierString, or Search options are specified."
    }

    return Get-WHDResource @QueryParameters
}