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 SkiaSharp

Namespace Nexamas.UI.Components

    Friend NotInheritable Class ButtonVisualPolicy
        Private Sub New()
        End Sub

        Friend Structure ButtonVisualResult
            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 Resolve(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 ButtonVisualResult

            Dim result As ButtonVisualResult = CreateFallback(baseRect)

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

            Dim app As IMASAppTheme = ctx.Theme
            If app Is Nothing Then Return result

            Dim surfaceVisual As ButtonSurfacePolicy.ButtonSurfaceVisualResult =
                ButtonSurfacePolicy.Resolve(
                    ctx:=ctx,
                    personality:=personality,
                    intent:=intent,
                    isDefault:=isDefault,
                    state:=state,
                    contract:=contract,
                    isSelected:=isSelected,
                    baseRect:=baseRect,
                    dpi:=dpi)

            Dim contentVisual As ButtonContentPolicy.ButtonContentVisualResult =
                ButtonContentPolicy.Resolve(
                    ctx:=ctx,
                    personality:=personality,
                    intent:=intent,
                    state:=surfaceVisual.MASVisualInteractionState,
                    dpi:=dpi)

            result.Surface = surfaceVisual.Surface
            result.TextColor = contentVisual.TextColor
            result.IconColor = contentVisual.IconColor
            result.Overlay = surfaceVisual.Overlay
            result.ShadowRect = surfaceVisual.ShadowRect
            result.ContentOffsetY = contentVisual.ContentOffsetY

            Return result
        End Function

        Private Shared Function CreateFallback(baseRect As SKRect) As ButtonVisualResult
            Return New ButtonVisualResult With {
                .Surface = ButtonPolicyDefaults.TransparentSurface(),
                .TextColor = SKColors.Transparent,
                .IconColor = SKColors.Transparent,
                .Overlay = ButtonPolicyDefaults.EmptyOverlaySpec(),
                .ShadowRect = baseRect,
                .ContentOffsetY = 0.0F
            }
        End Function



    End Class

End Namespace
