Option Strict On
Option Explicit On

Imports System
Imports System.Reflection
Imports System.Windows.Forms
Imports Nexamas.UI.Localization

Namespace Nexamas.UI.Quality

    ''' <summary>
    ''' Proves Phase-14 / LOC-R01..LOC-R04 residual Localization/RTL SDK readiness:
    ''' UI layout direction is separated from content text direction, catalog preview rendering is bounded,
    ''' keyboard/accessibility semantics are explicit, and runtime RTL mutations officially rebase input geometry.
    ''' </summary>
    Friend NotInheritable Class MASLocalizationRtlResidualReviewGate
        Private Sub New()
        End Sub

        Friend Shared Function Passes() As Boolean
            Return ProbeUiLayoutAndContentTextDirectionAreSeparate() AndAlso
                   ProbeLocalizationCatalogPreviewIsBounded() AndAlso
                   ProbeRtlKeyboardAccessibilitySemantics() AndAlso
                   ProbeRuntimeRtlMutationRebasesInputState()
        End Function

        Private Shared Function ProbeUiLayoutAndContentTextDirectionAreSeparate() As Boolean
            Try
                Return ProbeEnglishUiWithArabicContentDirection() AndAlso
                       ProbeArabicUiWithEnglishContentDirection()
            Catch ex As Exception
                Nexamas.UI.Diagnostics.MASExceptionSilencer.SwallowDiagnosticOnly(ex, "MASLocalizationRtlResidualReviewGate.DirectionContract")
                Return False
            End Try
        End Function

        Private Shared Function ProbeEnglishUiWithArabicContentDirection() As Boolean
            Dim englishUiArabicText As MASLocalizationDirectionContractResolution =
                MASLocalizationDirectionContract.Resolve("en-US", BuildArabicWelcomeText())

            Return englishUiArabicText IsNot Nothing AndAlso
                   englishUiArabicText.UiLayoutFlow = MASLocalizationLayoutFlow.Standard AndAlso
                   englishUiArabicText.UiTextDirection = MASLocalizationTextDirection.LeftToRight AndAlso
                   englishUiArabicText.ContentTextDirection = MASLocalizationTextDirection.RightToLeft AndAlso
                   englishUiArabicText.SeparatesUiLayoutFromContentTextDirection
        End Function

        Private Shared Function ProbeArabicUiWithEnglishContentDirection() As Boolean
            Dim arabicUiEnglishText As MASLocalizationDirectionContractResolution =
                MASLocalizationDirectionContract.Resolve("ar-SY", "Nexamas UI SDK launch readiness")

            Return arabicUiEnglishText IsNot Nothing AndAlso
                   arabicUiEnglishText.UiLayoutFlow = MASLocalizationLayoutFlow.Mirrored AndAlso
                   arabicUiEnglishText.UiTextDirection = MASLocalizationTextDirection.RightToLeft AndAlso
                   arabicUiEnglishText.ContentTextDirection = MASLocalizationTextDirection.LeftToRight AndAlso
                   arabicUiEnglishText.SeparatesUiLayoutFromContentTextDirection
        End Function

        Private Shared Function BuildArabicWelcomeText() As String
            Return ChrW(&H645) & ChrW(&H631) & ChrW(&H62D) & ChrW(&H628) & ChrW(&H627) &
                   " " & ChrW(&H628) & ChrW(&H643) & ChrW(&H645) &
                   " " & ChrW(&H641) & ChrW(&H64A) &
                   " Nexamas UI"
        End Function

        Private Shared Function ProbeLocalizationCatalogPreviewIsBounded() As Boolean
            Try
                Dim snapshot As MASLocalizationSnapshot = MASLocalization.CreateSnapshot()
                Return snapshot IsNot Nothing AndAlso
                       snapshot.ReadyForProductLayer AndAlso
                       MASLocalizationRtlPage.BoundedPreviewLimitForTests = 256 AndAlso
                       MASLocalizationRtlPage.BoundedPreviewLimitForTests >= snapshot.CultureCount AndAlso
                       MASLocalizationRtlPage.BoundedPreviewLimitForTests >= snapshot.LocalizedStringCount
            Catch ex As Exception
                Nexamas.UI.Diagnostics.MASExceptionSilencer.SwallowDiagnosticOnly(ex, "MASLocalizationRtlResidualReviewGate.BoundedPreview")
                Return False
            End Try
        End Function

        Private Shared Function ProbeRtlKeyboardAccessibilitySemantics() As Boolean
            Try
                Dim rtlLeft As MASLocalizationKeyboardNavigationIntent =
                    MASLocalizationDirectionContract.ResolveHorizontalNavigation(MASLocalizationLayoutFlow.Mirrored, Keys.Left)
                Dim rtlRight As MASLocalizationKeyboardNavigationIntent =
                    MASLocalizationDirectionContract.ResolveHorizontalNavigation(MASLocalizationLayoutFlow.Mirrored, Keys.Right)
                Dim ltrLeft As MASLocalizationKeyboardNavigationIntent =
                    MASLocalizationDirectionContract.ResolveHorizontalNavigation(MASLocalizationLayoutFlow.Standard, Keys.Left)
                Dim ltrRight As MASLocalizationKeyboardNavigationIntent =
                    MASLocalizationDirectionContract.ResolveHorizontalNavigation(MASLocalizationLayoutFlow.Standard, Keys.Right)

                Return rtlLeft = MASLocalizationKeyboardNavigationIntent.NextLogicalItem AndAlso
                       rtlRight = MASLocalizationKeyboardNavigationIntent.PreviousLogicalItem AndAlso
                       ltrLeft = MASLocalizationKeyboardNavigationIntent.PreviousLogicalItem AndAlso
                       ltrRight = MASLocalizationKeyboardNavigationIntent.NextLogicalItem AndAlso
                       Not MASLocalizationDirectionContract.MirrorsTabOrder(MASLocalizationLayoutFlow.Mirrored) AndAlso
                       MASLocalizationDirectionContract.MirrorsHorizontalKeyboardNavigation(MASLocalizationLayoutFlow.Mirrored)
            Catch ex As Exception
                Nexamas.UI.Diagnostics.MASExceptionSilencer.SwallowDiagnosticOnly(ex, "MASLocalizationRtlResidualReviewGate.KeyboardAccessibility")
                Return False
            End Try
        End Function

        Private Shared Function ProbeRuntimeRtlMutationRebasesInputState() As Boolean
            Try
                Const flags As BindingFlags = BindingFlags.Instance Or BindingFlags.NonPublic
                Dim rootType As Type = GetType(Nexamas.UI.Host.MASSkiaRootHost)
                Dim releaseMethod As MethodInfo = rootType.GetMethod("ReleaseInputCaptureForRuntimeEnvironmentMutation", flags)
                Dim rebaseMethod As MethodInfo = rootType.GetMethod("RebaseInputHoverForRuntimeEnvironmentMutation", flags)

                Return releaseMethod IsNot Nothing AndAlso
                       rebaseMethod IsNot Nothing AndAlso
                       String.Equals(releaseMethod.ReturnType.FullName, "System.Void", StringComparison.Ordinal) AndAlso
                       String.Equals(rebaseMethod.ReturnType.FullName, "System.Void", StringComparison.Ordinal)
            Catch ex As Exception
                Nexamas.UI.Diagnostics.MASExceptionSilencer.SwallowDiagnosticOnly(ex, "MASLocalizationRtlResidualReviewGate.RuntimeInputRebase")
                Return False
            End Try
        End Function
    End Class

End Namespace
