Option Strict On
Option Explicit On

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

Namespace Nexamas.UI.Components

    Friend NotInheritable Class MASButtonStateResolver

        Private Sub New()
        End Sub

        Friend Structure ButtonStateRenderSpec
            Friend MASVisualInteractionState As MASInteractionState
            Friend InteractionStateSet As MASInteractionStateSet
            Friend Surface As MASButtonSurfaceTheme
            Friend TextColor As SKColor
            Friend IconColor As SKColor
            Friend Overlay As MASVisualInteractionOverlaySpec
            Friend ShadowRect As SKRect
            Friend ContentOffsetY As Single
        End Structure

        Friend Shared Function ResolveRenderSpec(ctx As MASThemeContext,
                                                 personality As MASButtonPersonality,
                                                 intent As MASButtonIntent,
                                                 isDefault As Boolean,
                                                 state As MASButtonState,
                                                 contract As MASResolvedComponentContract,
                                                 isSelected As Boolean,
                                                 baseRect As SKRect,
                                                 dpi As Single) As ButtonStateRenderSpec

            Dim masState As MASInteractionState =
                MASInteractionResolver.NormalizeState(
                    state.ToMASInteractionState(isSelected))

            Dim spec As New ButtonStateRenderSpec With {
                .MASVisualInteractionState = masState,
                .InteractionStateSet = New MASInteractionStateSet(masState),
                .Surface = ButtonPolicyDefaults.TransparentSurface(),
                .TextColor = SKColors.Transparent,
                .IconColor = SKColors.Transparent,
                .Overlay = ButtonPolicyDefaults.EmptyOverlaySpec(),
                .ShadowRect = baseRect,
                .ContentOffsetY = 0.0F
            }

            If ctx Is Nothing OrElse ctx.Theme Is Nothing OrElse contract Is Nothing Then Return spec
            contract.AssertConsumable()

            Dim visual As ButtonVisualPolicy.ButtonVisualResult =
                ButtonVisualPolicy.Resolve(
                    ctx:=ctx,
                    personality:=personality,
                    intent:=intent,
                    isDefault:=isDefault,
                    state:=state,
                    contract:=contract,
                    isSelected:=isSelected,
                    baseRect:=baseRect,
                    dpi:=dpi
                )

            spec.Surface = visual.Surface
            spec.TextColor = visual.TextColor
            spec.IconColor = visual.IconColor
            spec.Overlay = visual.Overlay
            spec.ShadowRect = visual.ShadowRect
            spec.ContentOffsetY = visual.ContentOffsetY

            Return spec
        End Function



    End Class

End Namespace