Option Strict On
Option Explicit On

Namespace Nexamas.UI.Components

    Friend NotInheritable Class MASButtonInteractionController

        Friend Function HandleMouseMove(
            state As MASButtonState,
            isEnabled As Boolean,
            isInside As Boolean) As MASButtonInteractionResult

            Dim newState = state
            Dim changed As Boolean = False

            If newState.IsEnabled <> isEnabled Then
                newState.IsEnabled = isEnabled
                changed = True
            End If

            If Not isEnabled Then
                If newState.IsHovered Then
                    newState.IsHovered = False
                    changed = True
                End If

                If newState.IsPressed Then
                    newState.IsPressed = False
                    changed = True
                End If

                Return New MASButtonInteractionResult With {
                    .State = newState,
                    .ShouldInvalidate = changed
                }
            End If

            If newState.IsHovered <> isInside Then
                newState.IsHovered = isInside
                changed = True
            End If

            If newState.IsPressed AndAlso Not isInside Then
                newState.IsPressed = False
                changed = True
            End If

            Return New MASButtonInteractionResult With {
                .State = newState,
                .ShouldInvalidate = changed
            }
        End Function

        Friend Function HandleMouseDown(
            state As MASButtonState,
            isEnabled As Boolean,
            isInside As Boolean) As MASButtonInteractionResult

            Dim newState = state
            Dim changed As Boolean = False

            If newState.IsEnabled <> isEnabled Then
                newState.IsEnabled = isEnabled
                changed = True
            End If

            If Not isEnabled Then
                If newState.IsHovered Then
                    newState.IsHovered = False
                    changed = True
                End If

                If newState.IsPressed Then
                    newState.IsPressed = False
                    changed = True
                End If

                Return New MASButtonInteractionResult With {
                    .State = newState,
                    .ShouldInvalidate = changed
                }
            End If

            If isInside Then
                If Not newState.IsPressed Then
                    newState.IsPressed = True
                    changed = True
                End If

                If Not newState.IsHovered Then
                    newState.IsHovered = True
                    changed = True
                End If
            End If

            Return New MASButtonInteractionResult With {
                .State = newState,
                .ShouldInvalidate = changed
            }
        End Function

        Friend Function HandleMouseUp(
            state As MASButtonState,
            isEnabled As Boolean,
            isInside As Boolean) As MASButtonInteractionResult

            Dim newState = state
            Dim changed As Boolean = False

            If newState.IsEnabled <> isEnabled Then
                newState.IsEnabled = isEnabled
                changed = True
            End If

            If Not isEnabled Then
                If newState.IsPressed Then
                    newState.IsPressed = False
                    changed = True
                End If

                If newState.IsHovered Then
                    newState.IsHovered = False
                    changed = True
                End If

                If newState.IsFocused Then
                    newState.IsFocused = False
                    changed = True
                End If

                Return New MASButtonInteractionResult With {
                    .State = newState,
                    .ShouldInvalidate = changed
                }
            End If

            Dim wasPressed As Boolean = state.IsPressed

            If newState.IsPressed Then
                newState.IsPressed = False
                changed = True
            End If

            If newState.IsHovered <> isInside Then
                newState.IsHovered = isInside
                changed = True
            End If

            Return New MASButtonInteractionResult With {
                .State = newState,
                .ShouldInvalidate = changed,
                .IsClick = wasPressed AndAlso isInside
            }
        End Function

        Friend Function HandleFocus(
            state As MASButtonState) As MASButtonInteractionResult

            Dim newState = state
            Dim changed As Boolean = Not newState.IsFocused

            newState.IsFocused = True

            Return New MASButtonInteractionResult With {
                .State = newState,
                .ShouldInvalidate = changed
            }
        End Function

        Friend Function HandleBlur(
            state As MASButtonState) As MASButtonInteractionResult

            Dim newState = state
            Dim changed As Boolean = newState.IsFocused OrElse newState.IsPressed

            newState.IsFocused = False
            newState.IsPressed = False

            Return New MASButtonInteractionResult With {
                .State = newState,
                .ShouldInvalidate = changed
            }
        End Function

        Friend Function HandleKeyboardActivate(
            state As MASButtonState,
            isEnabled As Boolean) As MASButtonInteractionResult

            Dim newState = state
            Dim changed As Boolean = False

            If newState.IsEnabled <> isEnabled Then
                newState.IsEnabled = isEnabled
                changed = True
            End If

            If Not isEnabled Then
                Return New MASButtonInteractionResult With {
                    .State = newState,
                    .ShouldInvalidate = changed
                }
            End If

            If Not newState.IsFocused Then
                newState.IsFocused = True
                changed = True
            End If

            Return New MASButtonInteractionResult With {
                .State = newState,
                .ShouldInvalidate = changed,
                .IsClick = True
            }
        End Function


        Friend Function HandleCancel(
            state As MASButtonState) As MASButtonInteractionResult

            Dim newState = state
            Dim changed As Boolean = False

            If newState.IsHovered Then
                newState.IsHovered = False
                changed = True
            End If

            If newState.IsPressed Then
                newState.IsPressed = False
                changed = True
            End If

            Return New MASButtonInteractionResult With {
                .State = newState,
                .ShouldInvalidate = changed
            }
        End Function

        Friend Function HandleHostLostFocus(
            state As MASButtonState) As MASButtonInteractionResult

            Dim newState = state
            Dim changed As Boolean = False

            If newState.IsHovered Then
                newState.IsHovered = False
                changed = True
            End If

            If newState.IsPressed Then
                newState.IsPressed = False
                changed = True
            End If

            If newState.IsFocused Then
                newState.IsFocused = False
                changed = True
            End If

            Return New MASButtonInteractionResult With {
                .State = newState,
                .ShouldInvalidate = changed
            }
        End Function

        Friend Function HandleEnabledChanged(
            state As MASButtonState,
            isEnabled As Boolean) As MASButtonInteractionResult

            Dim newState = state
            Dim changed As Boolean = False

            If newState.IsEnabled <> isEnabled Then
                newState.IsEnabled = isEnabled
                changed = True
            End If

            If Not isEnabled Then
                If newState.IsHovered Then
                    newState.IsHovered = False
                    changed = True
                End If

                If newState.IsPressed Then
                    newState.IsPressed = False
                    changed = True
                End If

                If newState.IsFocused Then
                    newState.IsFocused = False
                    changed = True
                End If
            End If

            Return New MASButtonInteractionResult With {
                .State = newState,
                .ShouldInvalidate = changed
            }
        End Function

    End Class

End Namespace