$ErrorActionPreference = "Stop"

function Validate-Scripts {
    Param (
        [Parameter(Mandatory=$true)]
        [string[]]$Path,
        [Parameter(Mandatory=$true)]
        [string]$ExpectedShebang
    )
    $ScriptWithoutShebangLine = @()
    Get-ChildItem $path -Recurse -File -Filter "*.sh" | ForEach-Object {
        $relativePath = Resolve-Path $_.FullName -Relative
        $shebangLine = Get-Content -Path $_.FullName | Select-Object -First 1
        if ($shebangLine -eq $ExpectedShebang) {
            Write-Host "[+] '$relativePath'"
        }
        else {
            Write-Host "[-] '$relativePath'"
            $ScriptWithoutShebangLine += $relativePath
        }
    }
    return $ScriptWithoutShebangLine
}

$PathUbuntu = "./images/ubuntu/scripts"
$PathMacOS = "./images/macos"
$PatternUbuntu = "#!/bin/bash -e"
$PatternMacOS = "#!/bin/bash -e -o pipefail"
$ScriptsWithBrokenShebang = @()
$ScriptsWithBrokenShebang += Validate-Scripts -Path $PathUbuntu -ExpectedShebang $PatternUbuntu
$ScriptsWithBrokenShebang += Validate-Scripts -Path $PathMacOS -ExpectedShebang $PatternMacOS
if ($ScriptsWithBrokenShebang.Length -gt 0) {
    Write-Host "`n`n`n##[error] The following scripts have incorrect shebang:"
    $ScriptsWithBrokenShebang | ForEach-Object {
        Write-Host "##[error] '$_'"
    }
    Write-Host "`n`n##[error] Expected shebang for scripts in 'images/ubuntu' folder is '$PatternUbuntu'"
    Write-Host "##[error] Expected shebang for scripts in 'images/macos' folder is '$PatternMacOS'"
    exit 1
    else {
        Write-Host "All scripts have correct shebang."
    }
}
