Option Strict On
Option Explicit On

Imports Nexamas.UI.Architecture
Imports Nexamas.UI.Controls
Imports Nexamas.UI.General
Imports Nexamas.UI.Rendering
Imports Nexamas.UI.Theming
Imports Nexamas.UI.Values
Imports SkiaSharp

Namespace Nexamas.UI.Components


    Partial Friend NotInheritable Class ButtonSurfacePolicy
        Private Shared Function ResolveInteractionTheme(ctx As MASThemeContext,
                                                        personality As MASButtonPersonality,
                                                        intent As MASButtonIntent) As MASButtonInteractionTheme

            If ctx Is Nothing Then Return Nothing

            Dim btnTheme As IMASButtonTheme = ctx.ButtonTheme
            If btnTheme Is Nothing Then Return Nothing

            Return btnTheme.Interaction(personality, intent)

        End Function




        Private Shared Function ResolveShadowRect(baseRect As SKRect,
                                                  personality As MASButtonPersonality,
                                                  state As MASInteractionState,
                                                  dpi As Single) As SKRect

            Dim dy As Single = 0.0F

            If personality = MASButtonPersonality.Tal Then
                Select Case state
                    Case MASInteractionState.Hovered
                        dy = -0.22F * dpi
                    Case MASInteractionState.Pressed
                        dy = 0.12F * dpi
                    Case MASInteractionState.Selected
                        dy = -0.04F * dpi
                End Select
            Else
                Select Case state
                    Case MASInteractionState.Hovered
                        dy = -0.6F * dpi
                    Case MASInteractionState.Pressed
                        dy = 0.8F * dpi
                    Case MASInteractionState.Selected
                        dy = -0.3F * dpi
                End Select
            End If

            Return New SKRect(baseRect.Left, baseRect.Top + dy, baseRect.Right, baseRect.Bottom + dy)

        End Function




        Private Shared Function CreateFallback(baseRect As SKRect) As ButtonSurfaceVisualResult

            Return New ButtonSurfaceVisualResult With {
                .MASVisualInteractionState = MASInteractionState.None,
                .Surface = ButtonPolicyDefaults.TransparentSurface(),
                .Overlay = ButtonPolicyDefaults.EmptyOverlaySpec(),
                .ShadowRect = baseRect
            }

        End Function






        Private Shared Function RecolorPreserveAlpha(source As SKColor,
                                                     replacement As SKColor) As SKColor

            Return New SKColor(
                replacement.Red,
                replacement.Green,
                replacement.Blue,
                source.Alpha)

        End Function




        Private Shared Function MaxAlpha(current As Byte,
                                         minimum As Byte) As Byte

            If current < minimum Then Return minimum
            Return current

        End Function




        Private Shared Function ScaleAlpha(alpha As Byte,
                                           mul As Single) As Byte

            Dim x As Integer =
                CInt(Math.Round(CInt(alpha) * Math.Max(0.0F, mul)))

            If x < 0 Then x = 0
            If x > 255 Then x = 255

            Return CByte(x)

        End Function




        Private Shared Function Has(value As MASInteractionState,
                                    state As MASInteractionState) As Boolean

            Return (value And state) = state

        End Function

    End Class

End Namespace
