Public/Get-SummitSchedule.ps1

function Get-SummitSchedule {
    <#
    .SYNOPSIS
        Gets the PowerShell + DevOps Global Summit schedule.
 
    .DESCRIPTION
        Returns sessions from the bundled schedule data. No network calls required.
        Supports filtering by day, speaker, category, or title search.
 
    .PARAMETER Year
        The summit year to query. Defaults to the current year.
 
    .PARAMETER Day
        Filter sessions by day of the week.
 
    .PARAMETER Speaker
        Filter sessions by speaker name (wildcard match).
 
    .PARAMETER Category
        Filter sessions by category/track.
 
    .PARAMETER Search
        Search session titles (wildcard match).
 
    .PARAMETER Detail
        Return all properties for each session (description, tags, speaker company, etc.)
        instead of the default summary view.
 
    .EXAMPLE
        Get-SummitSchedule
 
    .EXAMPLE
        Get-SummitSchedule -Day Monday
 
    .EXAMPLE
        Get-SummitSchedule -Category Keynote
 
    .EXAMPLE
        Get-SummitSchedule -Speaker "Justin" -Day Tuesday
 
    .EXAMPLE
        Get-SummitSchedule -Search "PowerShell" | Get-SummitSession
 
    .EXAMPLE
        Get-SummitSchedule -Day Monday -Detail
    #>

    [CmdletBinding()]
    [OutputType('SummitSchedule.Session')]
    param(
        [int]$Year = (Get-Date).Year,

        [ValidateSet('Monday', 'Tuesday', 'Wednesday', 'Thursday')]
        [string[]]$Day,

        [string]$Speaker,

        [ValidateSet(
            'Artificial Intelligence', 'Automation', 'Cloud', 'DevOps',
            'Focus Group', 'Food', 'General', 'Keynote', 'PowerShell',
            'Quality of Life', 'Real-World Solutions', 'Security',
            'Soft Skills & Career Growth', 'Summit'
        )]
        [string[]]$Category,

        [string]$Search,

        [switch]$Detail
    )

    $dataFile = Join-Path $script:DataPath "$Year.json"

    if (-not (Test-Path $dataFile)) {
        Write-Error "No schedule data found for $Year. Available years: $($script:AvailableYears -join ', ')"
        return
    }

    if (-not $script:Cache.ContainsKey($Year)) {
        $raw = Get-Content -Path $dataFile -Raw | ConvertFrom-Json
        $sessions = [System.Collections.Generic.List[PSCustomObject]]::new()

        foreach ($r in $raw) {
            $sessions.Add([PSCustomObject]@{
                PSTypeName = 'SummitSchedule.Session'
                Day        = $r.Day
                Date       = $r.Date
                Time       = $r.Time
                Title      = $r.Title
                Room       = $r.Room
                Speaker    = $r.Speaker
                Category   = $r.Category
                EventId    = $r.EventId
                Url        = $r.Url
                Year       = [int]$r.Year
            })
        }

        $script:Cache[$Year] = $sessions
    }

    $results = $script:Cache[$Year]

    if ($Day) {
        $results = @($results | Where-Object { $_.Day -in $Day })
    }
    if ($PSBoundParameters.ContainsKey('Speaker') -and $Speaker) {
        $results = @($results | Where-Object { $_.Speaker -like "*$Speaker*" })
    }
    if ($Category) {
        $results = @($results | Where-Object { $_.Category -in $Category })
    }
    if ($Search) {
        $results = @($results | Where-Object { $_.Title -like "*$Search*" })
    }

    if ($Detail) {
        if ($results.Count -eq 0) {
            return
        }
        $raw = Get-Content -Path $dataFile -Raw | ConvertFrom-Json
        $eventIds = $results | ForEach-Object { $_.EventId }
        foreach ($r in $raw) {
            if ($r.EventId -in $eventIds) {
                [PSCustomObject]@{
                    PSTypeName     = 'SummitSchedule.SessionDetail'
                    Title          = $r.Title
                    Day            = $r.Day
                    Date           = $r.Date
                    Time           = $r.Time
                    Speaker        = $r.Speaker
                    SpeakerCompany = $r.SpeakerCompany
                    Room           = $r.Room
                    Category       = $r.Category
                    Tags           = $r.Tags
                    Description    = $r.Description
                    EventId        = $r.EventId
                    Url            = $r.Url
                    Year           = [int]$r.Year
                }
            }
        }
        return
    }

    $results
}