public/Get-FootballFixtureLineup.ps1

function Get-FootballFixtureLineup {
    <#
        .EXAMPLE
            Get-FootballFixtureLineup -Header $HeaderObject -Token $Token -StartDate 2025-08-03 -Path C:\sportsmonk
         
    #>

    [CmdletBinding()]
    param(

        [Parameter(Mandatory=$true)]
        [ValidateNotNullOrEmpty()]
        [Object]$Header,

        [Parameter(Mandatory=$true)]
        [ValidateNotNullOrEmpty()]
        [string]$Path,

        [Parameter(Mandatory=$true)]
        [ValidateNotNullOrEmpty()]
        [string]$Token,

        [Parameter(Mandatory=$true)]
        [ValidateNotNullOrEmpty()]
        [string]$StartDate

    )
    process{

        $ErrorActionPreference = 'Stop'

        try {

            New-Directory -Path "$Path\temp\lineups"
            New-Directory -Path "$Path\temp\lineups-data"

            Remove-Item -Path "$Path\temp\lineups\*" -Recurse -Force -Confirm:$false

            $FilesToProcess = Get-ChildItem -Path "$Path\sportsmonk-predictions" -Recurse -Filter '*.csv' -File | Where-Object {$_.FullName -like '*231*'}
                | Where-Object {$_.FullName -like "*$StartDate*"}

            foreach ($FileToProcess in $FilesToProcess) {

                $FootballFixtures = Import-Csv -Path $($FileToProcess.FullName) -ErrorAction Stop

                $FixtureName = $($FixtureData.name).Replace(' ','-').ToLower()

                foreach ($FootballFixture in $FootballFixtures) {

                    $FixtureName = $($FootballFixture.FixtureName).Replace(' ','-').ToLower()
                    $FileExists = Test-Path -Path "$Path\temp\lineups-data\$StartDate-$FixtureName.csv"

                    if ($FileExists) {

                        $FixtureLineupData = Import-Csv -Path "$Path\temp\lineups-data\$StartDate-$FixtureName.csv" -ErrorAction Stop

                        if ($($FixtureLineupData.Count) -ge 1) {

                            Write-Warning -Message "$FixtureName lineup data exists"
                            continue

                        } # if
            
                    } # if

                    $FixtureId = $($FootballFixture.FixtureId)
                    $Uri = "https://api.sportmonks.com/v3/football/fixtures/$($FixtureId)?api_token=$Token&include=scores;formations;metadata;lineups.detailedposition&filters=lineupTypes:11"
                    $Response = Invoke-RestMethod $Uri -Method 'GET' -Headers $Header

                    $FixtureData = $($Response.data)
                    $FixtureLinups = $($FixtureData.lineups)
                    $FixtureFormations = $($FixtureData.formations)
                    $HomeFormation = $FixtureFormations | Where-Object {$_.location -eq 'home'}
                    $AwayFormation = $FixtureFormations | Where-Object {$_.location -eq 'away'}
                    $HomeLineup = $FixtureLinups | Where-Object {$_.team_id -eq $($HomeFormation.participant_id)}
                    $AwayLineup = $FixtureLinups | Where-Object {$_.team_id -eq $($AwayFormation.participant_id)}

                    $Lineups =@($HomeLineup,$AwayLineup)
                    $PSObjects =@()

                    foreach ($Lineup in $Lineups) {

                        foreach ($Position in $Lineup) {

                            $DetailedPosition = $($Position.detailedposition)
                        
                            $PSObject = [PSCustomObject]@{
                                fixture_name = $($FixtureData.name)
                                starting_at = $($FixtureData.starting_at)
                                team_id = $($Lineup.team_id)[0]
                                formation_field = $($Position.formation_field)
                                formation_position = $($Position.formation_position)
                                player_name = $($Position.player_name)
                                jersey_number = $($Position.jersey_number)
                                position = $($DetailedPosition.name)
                            }

                            $PSObjects += $PSObject
                                    
                        } # foreach

                    } # foreach

                    $FixtureName = $($FixtureData.name).Replace(' ','-').ToLower()
                    $HomeTeamFormation = $($HomeFormation.formation)
                    $AwayTeamFormation = $($AwayFormation.formation)

                    if ($HomeTeamFormation -eq '' -or $AwayTeamFormation -eq '') {

                        Write-Warning -Message "Formation missing $FixtureName"
                        continue
                        
                    } # if

                    $PSObjects | Export-Csv -Path "$Path\temp\lineups-data\$StartDate-$FixtureName.csv" -ErrorAction Stop

                    $Params =@{
                        DataFile = "$Path\temp\lineups-data\$StartDate-$FixtureName.csv"
                        TemplateFile = "$Path\git-hub\sportsmonk-api\templates\social_media_lineup_1.txt"
                        OutputFile = "$Path\temp\lineups\$StartDate-$FixtureName-lineups.txt"
                    }

                    Set-Location -Path "$Path\git-hub\sportsmonk-api\scripts" -ErrorAction Stop
                    .\populate-team-lineups.ps1 @Params -HomeFormation $HomeTeamFormation -AwayFormation $AwayTeamFormation

                } # foreach

            } # foreach

        }
        catch {

            "$($MyInvocation.MyCommand.Name): $_.Exception.Message"

        } # try catch

    } # process

} # function