Option Strict On
Option Explicit On

Imports System.Collections.Generic
Imports System.Globalization
Imports System.Linq

Namespace Nexamas.UI.Localization

    ''' <summary>
    ''' Readiness gate for the Phase 6 Localization / RTL product-layer foundation.
    ''' </summary>
    ''' <remarks>
    ''' The gate validates product-layer snapshot facts only. It does not mutate current culture,
    ''' UI controls, layout engines, thread state, resource files, rendering, or MASLocalizationRtl.AttachPage
    ''' lifecycle. Public page attach proof is owned by a separate attach-lifecycle gate.
    ''' </remarks>
    Friend NotInheritable Class MASLocalizationReadinessGate
        Private Sub New()
        End Sub

        Friend Shared Function Evaluate() As MASLocalizationReadinessReport
            Dim snapshot As MASLocalizationSnapshot = MASLocalizationSnapshotBuilder.Build()
            Dim findings As New List(Of MASLocalizationReadinessFinding)()

            If snapshot.ContractVersion <> MASLocalizationContractVersion.Current Then
                findings.Add(New MASLocalizationReadinessFinding("MASLocalization.ContractVersion", "Localization snapshot contract version is not current.", MASLocalizationReadinessSeverity.[Error]))
            End If

            If snapshot.CultureCount < 3 Then
                findings.Add(New MASLocalizationReadinessFinding("MASLocalization.CultureCoverage", "Phase 6 requires English, German, and Arabic culture profiles.", MASLocalizationReadinessSeverity.[Error]))
            End If

            If Not snapshot.HasRightToLeftCulture Then
                findings.Add(New MASLocalizationReadinessFinding("MASLocalization.MissingRtlCulture", "Phase 6 requires at least one RTL culture profile.", MASLocalizationReadinessSeverity.[Error]))
            End If

            If Not snapshot.HasMirroredLayoutCulture Then
                findings.Add(New MASLocalizationReadinessFinding("MASLocalization.MissingMirroredLayout", "Phase 6 requires a culture profile that requests mirrored layout.", MASLocalizationReadinessSeverity.[Error]))
            End If

            If snapshot.LocalizedStringCount < 3 Then
                findings.Add(New MASLocalizationReadinessFinding("MASLocalization.StringCoverage", "Phase 6 requires localizable product string samples.", MASLocalizationReadinessSeverity.[Error]))
            End If

            If snapshot.LocalizedStrings.Any(Function(entry) entry Is Nothing OrElse Not entry.IsComplete) Then
                findings.Add(New MASLocalizationReadinessFinding("MASLocalization.IncompleteStrings", "All Phase 6 sample strings must contain English, German, and Arabic text.", MASLocalizationReadinessSeverity.[Error]))
            End If

            If snapshot.FormatSampleCount < snapshot.CultureCount OrElse snapshot.FormatSamples.Any(Function(sample) sample Is Nothing OrElse Not sample.IsComplete) Then
                findings.Add(New MASLocalizationReadinessFinding("MASLocalization.FormatSamples", "Every supported culture requires number, currency, percent, and date preview samples.", MASLocalizationReadinessSeverity.[Error]))
            End If

            Dim maximumExpansionRatio As Double = 0.0R
            If snapshot.ExpansionSamples.Count > 0 Then
                maximumExpansionRatio = snapshot.ExpansionSamples.Max(Function(sample) sample.ExpansionRatio)
            End If

            If maximumExpansionRatio >= 1.8R Then
                findings.Add(New MASLocalizationReadinessFinding("MASLocalization.TextExpansionPressure", "At least one localized sample expands strongly and must be hosted by flexible layouts.", MASLocalizationReadinessSeverity.Warning))
            End If

            If CultureInfo.CurrentCulture Is Nothing OrElse CultureInfo.CurrentUICulture Is Nothing Then
                findings.Add(New MASLocalizationReadinessFinding("MASLocalization.CultureRuntimeUnavailable", "Current culture runtime facts are unavailable.", MASLocalizationReadinessSeverity.[Error]))
            End If

            Return New MASLocalizationReadinessReport(
                cultureCount:=snapshot.CultureCount,
                localizedStringCount:=snapshot.LocalizedStringCount,
                formatSampleCount:=snapshot.FormatSampleCount,
                expansionSampleCount:=snapshot.ExpansionSampleCount,
                hasRightToLeftCulture:=snapshot.HasRightToLeftCulture,
                hasMirroredLayoutCulture:=snapshot.HasMirroredLayoutCulture,
                findings:=findings)
        End Function
    End Class

End Namespace
