Option Strict On
Option Explicit On

Imports System
Imports System.Windows.Forms
Imports Nexamas.UI.Architecture
Imports Nexamas.UI.Components
Imports Nexamas.UI.Composition
Imports Nexamas.UI.General
Imports Nexamas.UI.Layout
Imports Nexamas.UI.Rendering
Imports Nexamas.UI.TextRendering
Imports Nexamas.UI.Theming
Imports Nexamas.UI.Values
Imports SkiaSharp

Namespace Nexamas.UI.Controls


    Partial Public NotInheritable Class MASButton
#Region "Mouse"

        Protected Overrides Sub OnMouseMove(ctx As MASThemeContext, ptPx As SKPoint)
            Dim isInside As Boolean = HitTest(ctx, ptPx)

            Dim result As MASButtonInteractionResult =
                _interactionController.HandleMouseMove(
                    state:=_state,
                    isEnabled:=CanRenderAsEnabled(),
                    isInside:=isInside
                )

            ApplyResult(result)
        End Sub

        Protected Overrides Function OnMouseDown(ctx As MASThemeContext, ptPx As SKPoint, button As Integer) As Boolean
            If button <> CInt(MouseButtons.Left) Then Return False

            Dim isInside As Boolean = HitTest(ctx, ptPx)

            Dim result As MASButtonInteractionResult =
                _interactionController.HandleMouseDown(
                    state:=_state,
                    isEnabled:=CanRenderAsEnabled(),
                    isInside:=isInside
                )

            If isInside AndAlso CanActivate() Then RequestFocus()

            ApplyResult(result)

            If isInside AndAlso CanActivate() Then
                PulsePressMotion()
            End If

            Return isInside AndAlso CanActivate()
        End Function

        Protected Overrides Function OnMouseUp(ctx As MASThemeContext, ptPx As SKPoint, button As Integer) As Boolean
            If button <> CInt(MouseButtons.Left) Then Return False

            Dim isInside As Boolean = HitTest(ctx, ptPx)

            Dim result As MASButtonInteractionResult =
                _interactionController.HandleMouseUp(
                    state:=_state,
                    isEnabled:=CanRenderAsEnabled(),
                    isInside:=isInside
                )

            ApplyResult(result)

            If result.IsClick Then
                PerformClick()
            End If

            Return result.IsClick OrElse result.ShouldInvalidate
        End Function

        Protected Overrides Sub OnMouseLeave(ctx As MASThemeContext)
            Dim result As MASButtonInteractionResult =
                _interactionController.HandleMouseMove(
                    state:=_state,
                    isEnabled:=CanRenderAsEnabled(),
                    isInside:=False
                )

            ApplyResult(result)
        End Sub

        Protected Overrides Sub OnMouseCancel(ctx As MASThemeContext)
            StopPressMotion(clearPressed:=True)
            ApplyResult(_interactionController.HandleCancel(_state))
        End Sub

        Protected Overrides Sub OnHostLostFocus(ctx As MASThemeContext)
            StopPressMotion(clearPressed:=True)
            ApplyResult(_interactionController.HandleHostLostFocus(_state))
        End Sub

#End Region




#Region "Keyboard"

        Protected Overrides Function OnKeyDown(ctx As MASThemeContext, keyCode As Keys) As Boolean
            Select Case keyCode
                Case Keys.Enter, Keys.Space
                    If Not CanActivate() Then Return False

                    RequestFocus()

                    Dim result As MASButtonInteractionResult =
                        _interactionController.HandleKeyboardActivate(
                            state:=_state,
                            isEnabled:=CanRenderAsEnabled()
                        )

                    ApplyResult(result)

                    PulsePressMotion()

                    If result.IsClick Then
                        PerformClick()
                    End If

                    Return True

                Case Keys.Escape
                    StopPressMotion(clearPressed:=True)
                    ApplyResult(_interactionController.HandleCancel(_state))
                    Return True

                Case Else
                    Return False
            End Select
        End Function

        Protected Overrides Function WantsKeyboardFocus() As Boolean
            Return Visible AndAlso CanRenderAsEnabled() AndAlso
                   MASFocusResolver.CanReceiveKeyboardFocus(_contract)
        End Function

        Protected Overrides Function WantsPointerFocus() As Boolean
            Return Visible AndAlso CanRenderAsEnabled() AndAlso
                   MASFocusResolver.CanReceivePointerFocus(_contract)
        End Function

        Protected Overrides Sub OnGotKeyboardFocus()
            Dim result As MASButtonInteractionResult =
                _interactionController.HandleFocus(_state)

            ApplyResult(result)
        End Sub

        Protected Overrides Sub OnLostKeyboardFocus()
            StopPressMotion(clearPressed:=True)

            Dim result As MASButtonInteractionResult =
                _interactionController.HandleBlur(_state)

            ApplyResult(result)
        End Sub

#End Region

    End Class

End Namespace
