Option Strict On
Option Explicit On

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

Namespace Nexamas.UI.Components

    Friend Partial NotInheritable Class MASTimePickerClockView

#Region "Input"

        Protected Overrides Sub OnMouseMove(ctx As MASThemeContext, ptPx As SKPoint)
            Dim hit As HitTarget = HitTestTarget(ptPx)
            If SameHit(_hoverTarget, hit) Then Return

            _hoverTarget = hit
            InvalidateVisual()
        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

            RequestFocus()
            _pressedTarget = HitTestTarget(ptPx)
            InvalidateVisual()
            Return (_pressedTarget.Part <> HitPart.None)
        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 pressed As HitTarget = _pressedTarget
            _pressedTarget = New HitTarget()
            Dim released As HitTarget = HitTestTarget(ptPx)

            If SameHit(pressed, released) Then
                Activate(released.Part)
            End If

            InvalidateVisual()
            Return pressed.Part <> HitPart.None
        End Function

        Protected Overrides Sub OnMouseLeave(ctx As MASThemeContext)
            _hoverTarget = New HitTarget()
            _pressedTarget = New HitTarget()
            InvalidateVisual()
        End Sub

        Protected Overrides Sub OnMouseCancel(ctx As MASThemeContext)
            _hoverTarget = New HitTarget()
            _pressedTarget = New HitTarget()
            InvalidateVisual()
        End Sub

        Protected Overrides Function OnKeyDown(ctx As MASThemeContext,
                                               keyCode As Keys) As Boolean
            Dim digit As Integer
            If TryResolveDigitFromKey(keyCode, digit) Then
                If Not _isEditingTime Then BeginManualEdit()
                TryAppendManualEditDigit(digit)
                Return True
            End If

            If _isEditingTime Then Return HandleManualEditKey(keyCode)

            Select Case keyCode
                Case Keys.Left
                    AdjustMinutes(-_minuteStep)
                    Return True

                Case Keys.Right
                    AdjustMinutes(_minuteStep)
                    Return True

                Case Keys.Up
                    AdjustHours(1)
                    Return True

                Case Keys.Down
                    AdjustHours(-1)
                    Return True

                Case Keys.Enter, Keys.Space
                    _onTimeSelected?.Invoke(_workingTime)
                    Return True

                Case Keys.Delete, Keys.Back
                    _onTimeSelected?.Invoke(Nothing)
                    Return True
            End Select

            Return False
        End Function

        Protected Overrides Function OnTextInput(ctx As MASThemeContext,
                                                 text As String) As Boolean
            If String.IsNullOrEmpty(text) Then Return False
            If Not _isEditingTime Then BeginManualEdit()
            Return ApplyManualEditText(text)
        End Function

        Protected Overrides Function WantsKeyboardFocus() As Boolean
            Return True
        End Function

#End Region

    End Class

End Namespace
