Option Strict On
Option Explicit On

Imports System
Imports System.Globalization
Imports System.Threading
Imports Nexamas.UI.Components
Imports Nexamas.UI.Controls
Imports Nexamas.UI.Diagnostics
Imports Nexamas.UI.Theming
Imports Nexamas.UI.Values
Imports SkiaSharp

Namespace Nexamas.UI.Quality

    ''' <summary>
    ''' CPU-render regression proof for the culture/RTL path that previously produced broad MAS render-fault placeholders. The gate
    ''' renders representative text and DataGrid controls under live thread-culture switches without creating a parallel renderer.
    ''' </summary>
    Friend NotInheritable Class MASCultureRenderFaultRegressionGate

        Private Sub New()
        End Sub

        Friend Shared Function Passes() As Boolean
            Dim previousCulture As CultureInfo = Thread.CurrentThread.CurrentCulture
            Dim previousUICulture As CultureInfo = Thread.CurrentThread.CurrentUICulture

            Try
                For Each cultureName As String In New String() {"en-US", "de-DE", "ar-SA"}
                    Dim culture As CultureInfo = CultureInfo.GetCultureInfo(cultureName)
                    Thread.CurrentThread.CurrentCulture = culture
                    Thread.CurrentThread.CurrentUICulture = culture
                    If Not RenderProbe(cultureName) Then Return False
                Next

                Return True
            Catch ex As Exception
                MASExceptionSilencer.SwallowDiagnosticOnly(ex, "MASCultureRenderFaultRegressionGate")
                Return False
            Finally
                Thread.CurrentThread.CurrentCulture = previousCulture
                Thread.CurrentThread.CurrentUICulture = previousUICulture
            End Try
        End Function

        Private Shared Function RenderProbe(cultureName As String) As Boolean
            ThemeManager.EnsureInitializedCore()
            Dim ctx As New MASThemeContext(1.0F, New MASTypography(1.0F), ThemeManager.CurrentCore, 0)

            Using bitmap As New SKBitmap(520, 260)
                Using canvas As New SKCanvas(bitmap)
                    canvas.Clear(SKColors.Transparent)

                    Dim labelText As String = If(String.Equals(cultureName, "ar-SA", StringComparison.OrdinalIgnoreCase), "مرحبا MAS", "MAS culture probe " & cultureName)
                    Dim label As MASLabel = MASLabel.Create(labelText)
                    label.RenderInternal(canvas, ctx, New SKRect(4.0F, 4.0F, 500.0F, 36.0F))

                    Dim grid As New MASDataGrid()
                    Dim idColumn As MASDataGridColumn = grid.DataView.AddColumn("id", "Id")
                    idColumn.ValueTypeCode = TypeCode.Int32
                    Dim amountColumn As MASDataGridColumn = grid.DataView.AddColumn("amount", "Amount")
                    amountColumn.ValueTypeCode = TypeCode.Decimal
                    amountColumn.FormatString = "N2"
                    grid.DataView.AddRow(1, 1.5D)
                    grid.DataView.AddRow(2, 2.5D)
                    grid.DataView.SortByColumn("amount", MASDataGridSortDirection.Descending)
                    grid.SummaryFooterMode = MASDataGridSummaryFooterMode.Always
                    grid.DataView.PrepareVisibleSummarySnapshot()
                    grid.RenderInternal(canvas, ctx, New SKRect(4.0F, 44.0F, 500.0F, 240.0F))

                    If Not grid.DataView.RuntimeCultureKey.EndsWith("|" & cultureName, StringComparison.OrdinalIgnoreCase) Then Return False
                    If String.Equals(cultureName, "ar-SA", StringComparison.OrdinalIgnoreCase) AndAlso Not grid.DataView.IsRuntimeRightToLeft Then Return False
                End Using
            End Using

            Return True
        End Function

    End Class

End Namespace
