internal/functions/generation/Get-SldgGenerationQualityReport.ps1

function Get-SldgGenerationQualityReport {
    <#
    .SYNOPSIS
        Builds the GenerationQualityReport attached to a GenerationResult.
    .DESCRIPTION
        Pure aggregation over the table-level results plus FK-fallback statistics and the
        validation outcome. Centralising this here keeps the orchestrator readable and makes
        the report shape unit-testable.
    .PARAMETER Plan
        The plan that was executed; supplies requested row and table counts.
    .PARAMETER TableResults
        One TableResult per table, including failed ones.
    .PARAMETER TotalInserted
        Rows inserted across all tables.
    .PARAMETER FkFallbackStats
        Foreign-key references whose parent values were loaded from the database.
    .PARAMETER ValidationRun
        Whether -ValidateAfterGeneration ran.
    .PARAMETER ValidationResults
        The validation checks, when validation ran.
    #>

    [CmdletBinding()]
    [OutputType([SqlLabDataGenerator.GenerationQualityReport])]
    param (
        [Parameter(Mandatory)]
        [SqlLabDataGenerator.GenerationPlan]$Plan,

        [Parameter(Mandatory)]
        [AllowEmptyCollection()]
        [SqlLabDataGenerator.TableResult[]]$TableResults,

        [Parameter(Mandatory)]
        [int]$TotalInserted,

        [SqlLabDataGenerator.ForeignKeyFallback[]]$FkFallbackStats,

        [bool]$ValidationRun,

        [SqlLabDataGenerator.ValidationResult[]]$ValidationResults
    )

    $requestedRows = ($Plan.Tables | Measure-Object -Property RowCount -Sum).Sum
    if ($null -eq $requestedRows) { $requestedRows = 0 }

    $failedRows = ($TableResults | Where-Object { -not $_.Success } | Measure-Object -Property RequestedRows -Sum).Sum
    if ($null -eq $failedRows) { $failedRows = 0 }

    $skippedRows = ($TableResults | Measure-Object -Property SkippedRows -Sum).Sum
    if ($null -eq $skippedRows) { $skippedRows = 0 }

    $fallbacks = @($FkFallbackStats | Where-Object { $null -ne $_ })
    $validationErrorCount = if ($ValidationRun) { @($ValidationResults | Where-Object { -not $_.Passed -and $_.Severity -eq 'Error' }).Count } else { 0 }
    $validationWarningCount = if ($ValidationRun) { @($ValidationResults | Where-Object { $_.Severity -eq 'Warning' }).Count } else { 0 }
    $validationPassed = if ($ValidationRun) { $validationErrorCount -eq 0 } else { $null }

    [SqlLabDataGenerator.GenerationQualityReport]@{
        RequestedRows            = [int]$requestedRows
        InsertedRows             = [int]$TotalInserted
        SkippedRows              = [int]$skippedRows
        FailedRows               = [int]$failedRows
        TableCount               = [int]$Plan.TableCount
        SuccessfulTables         = @($TableResults | Where-Object Success).Count
        FailedTables             = @($TableResults | Where-Object { -not $_.Success }).Count
        FKFallbackReferenceCount = $fallbacks.Count
        FKFallbackValueCount     = [int](($fallbacks | Measure-Object -Property ValueCount -Sum).Sum)
        FKFallbacks              = $fallbacks
        ValidationRun            = [bool]$ValidationRun
        ValidationPassed         = $validationPassed
        ValidationErrorCount     = $validationErrorCount
        ValidationWarningCount   = $validationWarningCount
    }
}