Private/StatisticsHelpers.ps1

# Classifies a unit as Translated, Missing, or NeedsReview for statistics commands.
function Get-XliffUnitCompletionState {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [XliffTranslationUnit]$Unit
    )

    if (Test-XliffTargetMissing -Unit $Unit) {
        return 'Missing'
    }

    if ($Unit.State -in @('needs-review', 'needs-review-adaptation', 'needs-review-l10n', 'needs-review-translation', 'needs-adaptation', 'needs-l10n')) {
        return 'NeedsReview'
    }

    if ($Unit.State -eq 'needs-translation') {
        return 'Missing'
    }

    return 'Translated'
}

# Builds the XliffParser.Statistics result object returned by Get-XliffStatistics.
function New-XliffStatistics {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [XliffTranslationUnit[]]$Units,

        [string]$Path,

        [string]$SourceLanguage,

        [string]$TargetLanguage
    )

    $total = $Units.Count
    $translated = 0
    $missing = 0
    $needsReview = 0

    foreach ($unit in $Units) {
        switch (Get-XliffUnitCompletionState -Unit $unit) {
            'Translated' { $translated++ }
            'Missing' { $missing++ }
            'NeedsReview' { $needsReview++ }
        }
    }

    $completion = if ($total -gt 0) {
        [math]::Round(($translated / $total) * 100, 2)
    } else {
        0
    }

    [pscustomobject]@{
        PSTypeName            = 'XliffParser.Statistics'
        Path                  = $Path
        SourceLanguage        = $SourceLanguage
        TargetLanguage        = $TargetLanguage
        TotalTranslations     = $total
        TranslatedCount       = $translated
        MissingCount          = $missing
        NeedsReviewCount      = $needsReview
        CompletionPercentage  = $completion
    }
}