Public/JobApplications/Get-FloRecruitJobApplication.ps1

function Get-FloRecruitJobApplication {
    <#
    .SYNOPSIS
        Retrieves job applications from FloRecruit.

    .DESCRIPTION
        Gets job applications with optional filtering by status, status bucket, and date range.
        Supports pagination and can retrieve all results automatically.

    .PARAMETER All
        Retrieve all job applications using automatic pagination.

    .PARAMETER Limit
        Maximum number of results to return per request (1-1000).

    .PARAMETER Cursor
        Pagination cursor for retrieving subsequent pages.

    .PARAMETER Status
        Filter by job application status (e.g., "Hired", "Rejected").

    .PARAMETER StatusBucket
        Filter by status bucket: Applied, Offered, or Hired.

    .PARAMETER StatusStart
        Filter for applications with status date >= this date.

    .PARAMETER StatusEnd
        Filter for applications with status date <= this date.

    .EXAMPLE
        Get-FloRecruitJobApplication -All
        Retrieves all job applications.

    .EXAMPLE
        Get-FloRecruitJobApplication -StatusBucket Hired -Limit 100
        Retrieves up to 100 hired applications.

    .EXAMPLE
        $start = Get-Date "2026-01-01"
        $end = Get-Date "2026-01-31"
        Get-FloRecruitJobApplication -StatusStart $start -StatusEnd $end
        Retrieves applications with status dates in January 2026.

    .EXAMPLE
        Get-FloRecruitJobApplication -Status "Offered" | Where-Object { $_.jobTitle -like "*Engineer*" }
        Retrieves offered applications and filters for engineering positions.

    .OUTPUTS
        Array of job application objects with PSTypeName 'FloRecruit.JobApplication'.
    #>

    [CmdletBinding(DefaultParameterSetName = 'List')]
    param(
        [Parameter(ParameterSetName = 'List')]
        [switch]$All,

        [Parameter(ParameterSetName = 'List')]
        [ValidateRange(1, 1000)]
        [int]$Limit,

        [Parameter(ParameterSetName = 'List')]
        [string]$Cursor,

        [Parameter()]
        [string]$Status,

        [Parameter()]
        [ValidateSet('Applied', 'Offered', 'Hired')]
        [string]$StatusBucket,

        [Parameter()]
        [datetime]$StatusStart,

        [Parameter()]
        [datetime]$StatusEnd
    )

    # Build query parameters
    $queryParams = @{}

    if ($Limit) {
        $queryParams['limit'] = $Limit
    }

    if ($Cursor) {
        $queryParams['cursor'] = $Cursor
    }

    if ($Status) {
        $queryParams['job_application_status'] = $Status
    }

    if ($StatusBucket) {
        $queryParams['job_application_status_bucket'] = $StatusBucket
    }

    if ($StatusStart) {
        # Convert to ISO-8601 UTC format
        $queryParams['job_application_status_start'] = $StatusStart.ToUniversalTime().ToString('yyyy-MM-ddTHH:mm:ssZ')
    }

    if ($StatusEnd) {
        # Convert to ISO-8601 UTC format
        $queryParams['job_application_status_end'] = $StatusEnd.ToUniversalTime().ToString('yyyy-MM-ddTHH:mm:ssZ')
    }

    # Build endpoint
    $endpoint = "/$Script:FloRecruitApiVersion/job-applications"

    Write-Verbose "Retrieving job applications from endpoint: $endpoint"

    try {
        # Use auto-pagination if -All is specified
        if ($All) {
            Write-Verbose "Using automatic pagination to retrieve all results"
            $results = Get-FloRecruitAllPages -Endpoint $endpoint -QueryParameters $queryParams
        }
        else {
            # Single request
            $results = Invoke-FloRecruitRequest -Endpoint $endpoint -Method GET -QueryParameters $queryParams
        }

        # Handle response - could be array or object with results property
        $jobApplications = @()
        if ($results -is [array]) {
            $jobApplications = $results
        }
        elseif ($results.results) {
            $jobApplications = $results.results
        }
        elseif ($results.data) {
            $jobApplications = $results.data
        }
        else {
            # Single object
            $jobApplications = @($results)
        }

        # Add PSTypeName to each result for better formatting
        foreach ($app in $jobApplications) {
            if ($app -is [PSCustomObject]) {
                $app.PSObject.TypeNames.Insert(0, 'FloRecruit.JobApplication')
            }
        }

        Write-Verbose "Retrieved $($jobApplications.Count) job application(s)"

        return $jobApplications
    }
    catch {
        Write-Error "Failed to retrieve job applications: $_"
        throw
    }
}