Private/Get-NSPScanBridgeReadinessDecision.ps1

function Get-NSPScanBridgeReadinessDecision {
    [CmdletBinding()]
    param(
        [ValidateSet('AgeAndExclusive','StableWindow','StrictQuiet')][string]$Mode='AgeAndExclusive',
        [long]$Length,
        [datetime]$LastWriteTimeUtc=[datetime]::MinValue,
        [datetime]$NowUtc=[datetime]::UtcNow,
        [bool]$IsPdf=$true,
        [bool]$IsContainer=$false,
        [bool]$Exists=$true,
        [double]$MinimumAgeSeconds=15,
        [double]$QuietSeconds=0,
        [int]$StableSamples=0,
        [double]$RequiredQuietSeconds=5,
        [int]$RequiredSamples=3,
        [ValidateSet('Available','Unavailable','NotTested')][string]$ProbeStatus='NotTested'
    )
    $reasons=New-Object System.Collections.Generic.List[string]
    if (-not $Exists) { $reasons.Add('MissingOrUnobservable') }
    if (-not $IsPdf -or $IsContainer) { $reasons.Add('NotPdf') }
    if ($Length -le 0) { $reasons.Add('Empty') }
    $age=($NowUtc-$LastWriteTimeUtc).TotalSeconds
    if ($Mode -eq 'AgeAndExclusive') {
        if ($age -lt $MinimumAgeSeconds) { $reasons.Add('MinimumAge') }
    } else {
        if ($QuietSeconds -lt $RequiredQuietSeconds) { $reasons.Add('QuietWindow') }
        if ($StableSamples -lt $RequiredSamples) { $reasons.Add('SampleCount') }
    }
    $metadataEligible=$reasons.Count -eq 0
    if ($ProbeStatus -ne 'Available') { $reasons.Add($(if($ProbeStatus -eq 'NotTested'){'LockNotTested'}else{'ExclusiveProbeFailed'})) }
    [pscustomobject]@{ Mode=$Mode; Ready=($reasons.Count -eq 0); MetadataEligible=$metadataEligible; Reasons=@($reasons); AgeSeconds=$age }
}