Option Strict On
Option Explicit On

Imports System
Imports System.Globalization
Imports Nexamas.UI.Diagnostics
Imports Nexamas.UI.RuntimeEnvironment
Imports Nexamas.UI.Virtualization

Namespace Nexamas.UI.Quality

    ''' <summary>
    ''' Regression proof for the runtime-environment stamp overflow failure that previously surfaced as broad render faults.
    ''' It exercises long culture keys, RTL/LTR switches, deterministic SameAs behavior, and virtualization conversion without
    ''' relying on unchecked Integer hash arithmetic or ad-hoc per-control cache keys.
    ''' </summary>
    Friend NotInheritable Class MASRuntimeEnvironmentStampRegressionGate

        Private Sub New()
        End Sub

        Friend Shared Function Passes() As Boolean
            Try
                If Not ProbeCultureStamp("en-US|en-US", isRtl:=False) Then Return False
                If Not ProbeCultureStamp("de-DE|de-DE", isRtl:=False) Then Return False
                If Not ProbeCultureStamp("ar-SA|ar-SA", isRtl:=True) Then Return False
                If Not ProbeLongCultureKeyDoesNotOverflow() Then Return False
                If Not ProbeVirtualizationStampConversionDoesNotOverflow() Then Return False
                Return True
            Catch ex As Exception
                MASExceptionSilencer.SwallowDiagnosticOnly(ex, "MASRuntimeEnvironmentStampRegressionGate")
                Return False
            End Try
        End Function

        Private Shared Function ProbeCultureStamp(cultureKey As String, isRtl As Boolean) As Boolean
            Dim stamp As MASRuntimeEnvironmentStamp = MASRuntimeEnvironmentStampBuilder.Create().
                WithCultureName(cultureKey).
                WithRightToLeft(isRtl).
                WithThemeRevision(Integer.MaxValue).
                WithDpiRevision(Integer.MaxValue).
                WithDensityRevision(Integer.MaxValue).
                WithFontRevision(Integer.MaxValue).
                WithTextDirectionRevision(If(isRtl, 1, 0)).
                Build()

            If stamp Is Nothing Then Return False
            If stamp.LocalizationRevision <= 0 Then Return False
            If stamp.IsRightToLeft <> isRtl Then Return False
            If isRtl AndAlso stamp.RtlRevision <= 0 Then Return False
            If Not String.Equals(stamp.CultureName, cultureKey, StringComparison.OrdinalIgnoreCase) Then Return False

            Dim sameStamp As MASRuntimeEnvironmentStamp = MASRuntimeEnvironmentStampBuilder.Create().
                WithCultureName(cultureKey).
                WithRightToLeft(isRtl).
                WithThemeRevision(Integer.MaxValue).
                WithDpiRevision(Integer.MaxValue).
                WithDensityRevision(Integer.MaxValue).
                WithFontRevision(Integer.MaxValue).
                WithTextDirectionRevision(If(isRtl, 1, 0)).
                Build()

            Return stamp.SameAs(sameStamp)
        End Function

        Private Shared Function ProbeLongCultureKeyDoesNotOverflow() As Boolean
            Dim longKey As String = New String("x"c, 4096) & "|" & New String("y"c, 4096)
            For i As Integer = 0 To 64
                Dim key As String = longKey & i.ToString(CultureInfo.InvariantCulture)
                Dim stamp As MASRuntimeEnvironmentStamp = MASRuntimeEnvironmentStampBuilder.Create().
                    WithCultureName(key).
                    WithRightToLeft((i Mod 2) = 0).
                    Build()

                If stamp Is Nothing Then Return False
                If stamp.LocalizationRevision <= 0 Then Return False
            Next

            Return True
        End Function

        Private Shared Function ProbeVirtualizationStampConversionDoesNotOverflow() As Boolean
            Dim rtlStamp As MASRuntimeEnvironmentStamp = MASRuntimeEnvironmentStampBuilder.Create().
                WithCultureName("ar-SA|ar-SA").
                WithRightToLeft(True).
                WithTextDirectionRevision(Integer.MaxValue).
                WithRtlRevision(Integer.MaxValue).
                Build()

            Dim virtualStamp As MASVirtualizationEnvironmentStamp = rtlStamp.ToVirtualizationStamp(
                itemCollectionRevision:=Integer.MaxValue,
                controlSizeRevision:=Integer.MaxValue,
                viewportExtentPx:=123456.0F)

            If virtualStamp Is Nothing OrElse Not virtualStamp.IsValid Then Return False
            If virtualStamp.LocalizationRevision < 0 Then Return False
            If virtualStamp.RtlRevision < 0 Then Return False
            Return virtualStamp.RtlRevision > 0
        End Function

    End Class

End Namespace
