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

    Partial Friend NotInheritable Class MASDatePickerCalendarView

#Region "Hit Testing"

        Private Function HitTestTarget(ptPx As SKPoint) As HitTarget
            If _lastPreviousRect.Contains(ptPx.X, ptPx.Y) Then
                Return New HitTarget() With {.Part = HitPart.PreviousMonth, .Index = -1, .Value = _displayMonth.AddMonths(-1)}
            End If

            If _lastNextRect.Contains(ptPx.X, ptPx.Y) Then
                Return New HitTarget() With {.Part = HitPart.NextMonth, .Index = -1, .Value = _displayMonth.AddMonths(1)}
            End If

            If _lastTitleRect.Contains(ptPx.X, ptPx.Y) Then
                Return New HitTarget() With {.Part = HitPart.MonthYearTitle, .Index = -1, .Value = _displayMonth}
            End If

            If _calendarMode = CalendarMode.MonthYear Then
                For i As Integer = 0 To _lastMonthCells.Length - 1
                    If _lastMonthCells(i).Contains(ptPx.X, ptPx.Y) Then
                        Return New HitTarget() With {.Part = HitPart.MonthChip, .Index = i, .Value = New Date(_displayMonth.Year, Math.Max(1, Math.Min(12, _lastMonthValues(i))), 1)}
                    End If
                Next

                For i As Integer = 0 To _lastYearCells.Length - 1
                    If _lastYearCells(i).Contains(ptPx.X, ptPx.Y) Then
                        Return New HitTarget() With {.Part = HitPart.YearChip, .Index = i, .Value = New Date(Math.Max(1, Math.Min(9999, _lastYearValues(i))), Math.Max(1, Math.Min(12, _pendingMonth)), 1)}
                    End If
                Next

                Return New HitTarget() With {.Part = HitPart.None, .Index = -1, .Value = DateTime.MinValue}
            End If

            For i As Integer = 0 To _lastDayCells.Length - 1
                If _lastDayCells(i).Contains(ptPx.X, ptPx.Y) Then
                    Return New HitTarget() With {.Part = HitPart.DayCell, .Index = i, .Value = _lastDayDates(i)}
                End If
            Next

            Return New HitTarget() With {.Part = HitPart.None, .Index = -1, .Value = DateTime.MinValue}
        End Function

        Private Shared Function SameHit(a As HitTarget, b As HitTarget) As Boolean
            Return a.Part = b.Part AndAlso a.Index = b.Index AndAlso a.Value.Date = b.Value.Date
        End Function

        Private Shared Function IsSameHit(target As HitTarget, part As HitPart, index As Integer) As Boolean
            Return target.Part = part AndAlso (index < 0 OrElse target.Index = index)
        End Function

#End Region

    End Class

End Namespace
