src/filters/FilterPipeline.ps1

#Requires -Version 5.1

function Invoke-FilterPipeline {
    <#
    .SYNOPSIS
    Applies all configured filters to courses in sequence.

    .DESCRIPTION
    Runs a complete filter chain: type matching, exclusion patterns, and minimum availability.
    Filters are applied in order; output of one becomes input to the next.

    .PARAMETER Courses
    Array of course objects to filter.

    .PARAMETER FilterConfig
    Configuration object with sections:
      - course_types: array of type filters (enabled, patterns)
      - exclude_patterns: array of regex patterns to exclude
      - min_availability: minimum availability threshold

    .OUTPUTS
    Array of courses that pass all enabled filters.

    .EXAMPLE
    $config = @{
        course_types = @(
            @{ enabled = $true; patterns = @('Basic') }
        )
        exclude_patterns = @('VIP', 'Private')
        min_availability = 1
    }
    Invoke-FilterPipeline -Courses $courses -FilterConfig $config

    .NOTES
    Returns empty array for null/empty input. Each filter is optional.
    #>

    [CmdletBinding()]
    param([ValidateNotNull()][object[]]$Courses, [ValidateNotNull()][object]$FilterConfig)
    if (-not $Courses) { return @() }
    $result = $Courses
    if ($FilterConfig.course_types) { $result = Get-FilteredCoursesByType -Courses $result -TypeFilters $FilterConfig.course_types }
    if ($FilterConfig.exclude_patterns) { $result = Get-FilteredCoursesByExclusion -Courses $result -ExcludePatterns $FilterConfig.exclude_patterns }
    if ($FilterConfig.min_availability -and $FilterConfig.min_availability -gt 0) { $result = @($result | Where-Object { $_.availability -ge $FilterConfig.min_availability }) }
    return $result
}