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

    ''' <summary>
    ''' Internal MAS-owned compact clock stepper hosted by MASTimePicker's FloatRuntime popup.
    ''' It remains Friend so Nexamas UI does not expose a standalone Clock product API.
    ''' </summary>
    Friend Partial NotInheritable Class MASTimePickerClockView
        Inherits MASControlBase
        Implements IMASLayoutParticipant
        Implements IMASIntrinsicSizeContract

        Private Enum HitPart
            None = 0
            HourDown = 1
            HourUp = 2
            MinuteDown = 3
            MinuteUp = 4
            NowAction = 5
            ClearAction = 6
            ConfirmAction = 7
            DisplayEditor = 8
        End Enum

        Private Structure HitTarget
            Friend Part As HitPart
        End Structure

        Private Shared ReadOnly _contract As MASResolvedComponentContract =
            MASArchitectureRuntime.ResolveContractOrThrow(GetType(MASTimePickerClockView))

        Private ReadOnly _owner As MASTimePicker
        Private ReadOnly _onTimeSelected As Action(Of Nullable(Of TimeSpan))
        Private ReadOnly _shadowPainter As New MASShadowPainter()
        Private ReadOnly _primitives As New MASVisualPrimitivesPainter()

        Private _workingTime As TimeSpan
        Private _minimumTime As Nullable(Of TimeSpan)
        Private _maximumTime As Nullable(Of TimeSpan)
        Private _minuteStep As Integer
        Private _clockFormat As MASTimePickerClockFormat
        Private _hoverTarget As HitTarget
        Private _pressedTarget As HitTarget
        Private _isEditingTime As Boolean
        Private _editBuffer As String = String.Empty
        Private _editSelectAll As Boolean
        Private _lastDisplayRect As SKRect
        Private _lastHourDownRect As SKRect
        Private _lastHourUpRect As SKRect
        Private _lastMinuteDownRect As SKRect
        Private _lastMinuteUpRect As SKRect
        Private _lastNowRect As SKRect
        Private _lastClearRect As SKRect
        Private _lastConfirmRect As SKRect
        Private _lastLayoutPlan As MASTimePickerClockLayoutPlan

        Friend Sub New(owner As MASTimePicker,
                       selectedTime As TimeSpan,
                       minimumTime As Nullable(Of TimeSpan),
                       maximumTime As Nullable(Of TimeSpan),
                       minuteStep As Integer,
                       onTimeSelected As Action(Of Nullable(Of TimeSpan)))
            MyBase.New()

            _owner = owner
            _minuteStep = MASTimePicker.NormalizeMinuteStep(minuteStep)
            _minimumTime = MASTimePicker.NormalizeNullableTime(minimumTime, _minuteStep)
            _maximumTime = MASTimePicker.NormalizeNullableTime(maximumTime, _minuteStep)
            _clockFormat = MASTimePickerClockFormatPolicy.Resolve(CultureInfo.CurrentCulture)
            _workingTime = ClampToRange(MASTimePicker.NormalizeTime(selectedTime, _minuteStep))
            _onTimeSelected = onTimeSelected
        End Sub

    End Class

End Namespace
