Option Strict On
Option Explicit On

Imports System
Imports Nexamas.UI.Controls
Imports Nexamas.UI.General
Imports SkiaSharp

Namespace Nexamas.UI.Components

    ''' <summary>
    ''' Friend-only premium policy for MASTabControl. It owns the visual and
    ''' geometry refinements for the existing tab renderer route: rail padding,
    ''' compact overflow navigation, tab chip density, whole-chip selection, rim
    ''' hierarchy, viewport fades, and scroll-step feel. It intentionally does not
    ''' introduce a new renderer, service, native TabControl, wrapper, adapter, or
    ''' public API.
    ''' </summary>
    Friend NotInheritable Class MASTabPremiumVisualPolicy

        Private Sub New()
        End Sub

        Friend Shared Function ResolveStripRimAlpha() As Byte
            Return 42
        End Function

        Friend Shared Function ResolveRailPaddingX(dpi As Single) As Single
            Return PixelSnap.SnapHalf(Math.Max(4.0F, 4.0F * PixelSnap.SafeDpi(dpi)))
        End Function

        Friend Shared Function ResolveRailPaddingY(dpi As Single) As Single
            Return PixelSnap.SnapHalf(Math.Max(3.0F, 3.0F * PixelSnap.SafeDpi(dpi)))
        End Function

        Friend Shared Function ResolveItemGap(dpi As Single) As Single
            Return PixelSnap.SnapHalf(Math.Max(2.0F, 3.0F * PixelSnap.SafeDpi(dpi)))
        End Function

        Friend Shared Function ResolveItemInsetX(dpi As Single) As Single
            Return PixelSnap.SnapHalf(Math.Max(0.5F, 1.0F * PixelSnap.SafeDpi(dpi)))
        End Function

        Friend Shared Function ResolveItemInsetY(dpi As Single) As Single
            Return PixelSnap.SnapHalf(Math.Max(0.5F, 1.0F * PixelSnap.SafeDpi(dpi)))
        End Function

        Friend Shared Function ResolveItemMinWidth(dpi As Single) As Single
            Return PixelSnap.SnapHalf(Math.Max(64.0F, 68.0F * PixelSnap.SafeDpi(dpi)))
        End Function

        Friend Shared Function ResolveItemTextPadX(dpi As Single) As Single
            Return PixelSnap.SnapHalf(Math.Max(9.0F, 10.0F * PixelSnap.SafeDpi(dpi)))
        End Function

        Friend Shared Function ResolveNavSlotWidth(stripHeightPx As Single,
                                                   dpi As Single) As Single
            Dim px As Single = PixelSnap.SafeDpi(dpi)
            Dim minimum As Single = 28.0F * px
            Dim maximum As Single = 34.0F * px
            Dim fromHeight As Single = Math.Max(minimum, stripHeightPx - (3.0F * px))
            Return PixelSnap.SnapHalf(Math.Min(maximum, fromHeight))
        End Function

        Friend Shared Function ResolveNavGap(dpi As Single) As Single
            Return PixelSnap.SnapHalf(Math.Max(1.0F, 2.0F * PixelSnap.SafeDpi(dpi)))
        End Function

        Friend Shared Function ResolveRevealMarginPx(dpi As Single) As Single
            Return PixelSnap.SnapHalf(Math.Max(6.0F, 7.0F * PixelSnap.SafeDpi(dpi)))
        End Function

        Friend Shared Function ResolveItemVisualRect(itemR As SKRect,
                                                     st As MASVisualInteractionState,
                                                     dpi As Single) As SKRect
            If itemR.Width <= 1.0F OrElse itemR.Height <= 1.0F Then Return SKRect.Empty

            Dim px As Single = PixelSnap.SafeDpi(dpi)
            Dim insetX As Single = 0.85F * px
            Dim insetY As Single = 1.25F * px

            Select Case st
                Case MASVisualInteractionState.Selected
                    insetX = 0.25F * px
                    insetY = 0.45F * px
                Case MASVisualInteractionState.Hover
                    insetX = 0.65F * px
                    insetY = 0.95F * px
                Case MASVisualInteractionState.Pressed
                    insetX = 0.9F * px
                    insetY = 1.55F * px
                Case MASVisualInteractionState.Disabled
                    insetX = 1.2F * px
                    insetY = 1.45F * px
            End Select

            Dim r As SKRect = itemR
            r.Inflate(-PixelSnap.SnapHalf(insetX), -PixelSnap.SnapHalf(insetY))
            If r.Width <= 1.0F OrElse r.Height <= 1.0F Then Return itemR
            Return PixelSnap.SnapRectHalf(r)
        End Function

        Friend Shared Function ResolveChipBaseAlpha(st As MASVisualInteractionState) As Byte
            Select Case st
                Case MASVisualInteractionState.Selected
                    Return 255
                Case MASVisualInteractionState.Pressed
                    Return 168
                Case MASVisualInteractionState.Hover
                    Return 142
                Case MASVisualInteractionState.Disabled
                    Return 38
                Case Else
                    Return 76
            End Select
        End Function

        Friend Shared Function ResolveWashAlpha(baseAlpha As Byte,
                                                st As MASVisualInteractionState) As Byte
            Select Case st
                Case MASVisualInteractionState.Selected
                    Return ClampByte(CInt(baseAlpha) + 8)
                Case MASVisualInteractionState.Hover
                    Return ClampByte(CInt(baseAlpha) + 3)
                Case MASVisualInteractionState.Pressed
                    Return ClampByte(CInt(Math.Round(CSng(baseAlpha) * 0.68F)))
                Case MASVisualInteractionState.Disabled
                    Return ClampByte(CInt(Math.Round(CSng(baseAlpha) * 0.36F)))
                Case Else
                    Return ClampByte(CInt(Math.Round(CSng(baseAlpha) * 0.42F)))
            End Select
        End Function

        Friend Shared Function ResolveGlossAlpha(baseAlpha As Byte,
                                                 st As MASVisualInteractionState) As Byte
            Select Case st
                Case MASVisualInteractionState.Selected
                    Return ClampByte(CInt(baseAlpha) + 7)
                Case MASVisualInteractionState.Hover
                    Return ClampByte(CInt(baseAlpha) + 2)
                Case MASVisualInteractionState.Pressed
                    Return ClampByte(CInt(Math.Round(CSng(baseAlpha) * 0.58F)))
                Case MASVisualInteractionState.Disabled
                    Return ClampByte(CInt(Math.Round(CSng(baseAlpha) * 0.32F)))
                Case Else
                    Return ClampByte(CInt(Math.Round(CSng(baseAlpha) * 0.38F)))
            End Select
        End Function

        Friend Shared Function ResolveOuterRimAlpha(st As MASVisualInteractionState) As Byte
            Select Case st
                Case MASVisualInteractionState.Selected
                    Return 62
                Case MASVisualInteractionState.Hover
                    Return 34
                Case MASVisualInteractionState.Pressed
                    Return 26
                Case MASVisualInteractionState.Disabled
                    Return 14
                Case Else
                    Return 16
            End Select
        End Function

        Friend Shared Function ResolveInnerRimAlpha(st As MASVisualInteractionState) As Byte
            Select Case st
                Case MASVisualInteractionState.Selected
                    Return 24
                Case MASVisualInteractionState.Hover
                    Return 12
                Case MASVisualInteractionState.Pressed
                    Return 8
                Case MASVisualInteractionState.Disabled
                    Return 4
                Case Else
                    Return 6
            End Select
        End Function

        Friend Shared Function ResolveViewportPlateInset(dpi As Single) As Single
            Return PixelSnap.SnapHalf(Math.Max(0.75F, 0.85F * PixelSnap.SafeDpi(dpi)))
        End Function

        Friend Shared Function ResolveViewportRadiusMultiplier() As Single
            Return 0.9F
        End Function

        Friend Shared Function ResolveViewportFadeWidth(viewportWidthPx As Single,
                                                        dpi As Single) As Single
            Dim px As Single = PixelSnap.SafeDpi(dpi)
            Return PixelSnap.SnapHalf(Math.Min(22.0F * px, Math.Max(8.0F * px, viewportWidthPx * 0.115F)))
        End Function

        Friend Shared Function ResolveNavPocketRect(buttonR As SKRect,
                                                    kind As MASTabNavButtonKind,
                                                    dpi As Single) As SKRect
            If buttonR.Width <= 1.0F OrElse buttonR.Height <= 1.0F Then Return SKRect.Empty

            Dim px As Single = PixelSnap.SafeDpi(dpi)
            Dim insetX As Single = Math.Max(2.0F, 2.5F * px)
            Dim insetY As Single = Math.Max(3.0F, 3.5F * px)
            Dim r As SKRect = buttonR
            r.Inflate(-PixelSnap.SnapHalf(insetX), -PixelSnap.SnapHalf(insetY))

            Dim size As Single = Math.Min(r.Width, r.Height)
            If size <= 1.0F Then Return PixelSnap.SnapRectHalf(r)

            size = PixelSnap.SnapHalf(size)
            Dim cx As Single = (r.Left + r.Right) * 0.5F
            Dim cy As Single = (r.Top + r.Bottom) * 0.5F

            Return PixelSnap.SnapRectHalf(New SKRect(
                cx - (size * 0.5F),
                cy - (size * 0.5F),
                cx + (size * 0.5F),
                cy + (size * 0.5F)))
        End Function

        Friend Shared Function ResolveNavPocketRadiusPx(r As SKRect,
                                                        dpi As Single) As Single
            If r.Width <= 0.0F OrElse r.Height <= 0.0F Then Return 0.0F
            Return PixelSnap.SafeRadius(Math.Min(Math.Min(r.Width, r.Height) * 0.5F, 13.0F * PixelSnap.SafeDpi(dpi)))
        End Function

        Friend Shared Function ResolveNavGlyphInsetX(dpi As Single) As Single
            Return PixelSnap.SnapHalf(Math.Max(6.0F, 6.75F * PixelSnap.SafeDpi(dpi)))
        End Function

        Friend Shared Function ResolveNavGlyphInsetY(dpi As Single) As Single
            Return PixelSnap.SnapHalf(Math.Max(5.0F, 5.75F * PixelSnap.SafeDpi(dpi)))
        End Function

        Friend Shared Function ResolveNavigationScrollStep(viewportWidthPx As Single,
                                                           dpi As Single) As Single
            Dim px As Single = PixelSnap.SafeDpi(dpi)
            Return PixelSnap.SnapHalf(Math.Max(44.0F * px, viewportWidthPx * 0.58F))
        End Function

        Friend Shared Function HasNoSelectedUnderlineRoute() As Boolean
            Return True
        End Function

        Friend Shared Function HasNoParallelTabRendererRoute() As Boolean
            Return True
        End Function

        Private Shared Function ClampByte(v As Integer) As Byte
            If v < 0 Then Return 0
            If v > 255 Then Return 255
            Return CByte(v)
        End Function

    End Class

End Namespace
