Option Strict On
Option Explicit On

Imports SkiaSharp

Namespace Nexamas.UI.Rendering

    ''' <summary>
    ''' Internal value-safety boundary for the PanelShell model.
    ''' It keeps invalid enum, padding, and geometry values from reaching the renderer while
    ''' preserving the public Application gateways as the only supported consumption path.
    ''' </summary>
    Friend NotInheritable Class MASPanelShellValueNormalizer

        Private Sub New()
        End Sub

        Friend Const ThemeDefaultPaddingDip As Single = -1.0F

        Friend Shared Function NormalizeDensity(value As MASPanelShellDensity) As MASPanelShellDensity
            Select Case value
                Case MASPanelShellDensity.Compact,
                     MASPanelShellDensity.Normal,
                     MASPanelShellDensity.Comfortable
                    Return value
                Case Else
                    Return MASPanelShellDensity.Normal
            End Select
        End Function

        Friend Shared Function NormalizeHeaderSize(value As MASPanelShellHeaderSize) As MASPanelShellHeaderSize
            Select Case value
                Case MASPanelShellHeaderSize.None,
                     MASPanelShellHeaderSize.Thin,
                     MASPanelShellHeaderSize.Compact,
                     MASPanelShellHeaderSize.Normal,
                     MASPanelShellHeaderSize.Comfortable,
                     MASPanelShellHeaderSize.Hero
                    Return value
                Case Else
                    Return MASPanelShellHeaderSize.Normal
            End Select
        End Function

        Friend Shared Function NormalizeStrength(value As MASPanelShellStrength) As MASPanelShellStrength
            Select Case value
                Case MASPanelShellStrength.ThemeDefault,
                     MASPanelShellStrength.Level1,
                     MASPanelShellStrength.Level2,
                     MASPanelShellStrength.Level3,
                     MASPanelShellStrength.Level4,
                     MASPanelShellStrength.Level5,
                     MASPanelShellStrength.Level6
                    Return value
                Case Else
                    Return MASPanelShellStrength.ThemeDefault
            End Select
        End Function

        Friend Shared Function NormalizePaddingDip(value As Single) As Single
            If Single.IsNaN(value) OrElse Single.IsInfinity(value) Then Return ThemeDefaultPaddingDip
            If value < 0.0F Then Return ThemeDefaultPaddingDip
            Return value
        End Function

        Friend Shared Function NormalizeNonNegativeDip(value As Single,
                                                       fallbackDip As Single) As Single
            If Single.IsNaN(value) OrElse Single.IsInfinity(value) Then Return Math.Max(0.0F, fallbackDip)
            If value < 0.0F Then Return Math.Max(0.0F, fallbackDip)
            Return value
        End Function

        Friend Shared Function NormalizeBoundsPx(boundsPx As SKRect) As SKRect
            If Not IsFinite(boundsPx.Left) OrElse
               Not IsFinite(boundsPx.Top) OrElse
               Not IsFinite(boundsPx.Right) OrElse
               Not IsFinite(boundsPx.Bottom) Then

                Return SKRect.Empty
            End If

            If boundsPx.Right <= boundsPx.Left OrElse boundsPx.Bottom <= boundsPx.Top Then
                Return SKRect.Empty
            End If

            Return boundsPx
        End Function

        Friend Shared Function NormalizeKey(value As String,
                                            fallback As String) As String
            Dim key As String = If(value, String.Empty).Trim()
            If key.Length = 0 Then Return If(fallback, String.Empty)
            Return key
        End Function

        Private Shared Function IsFinite(value As Single) As Boolean
            Return Not Single.IsNaN(value) AndAlso Not Single.IsInfinity(value)
        End Function

    End Class

End Namespace
