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 "Range / Date Rules"

        Private Function IsDateAllowed(value As Date) As Boolean
            Dim dateValue As Date = value.Date
            If _minimumDate.HasValue AndAlso dateValue < _minimumDate.Value Then Return False
            If _maximumDate.HasValue AndAlso dateValue > _maximumDate.Value Then Return False
            Return True
        End Function

        Private Function ClampToRange(value As Date) As Date
            Dim dateValue As Date = value.Date
            If _minimumDate.HasValue AndAlso dateValue < _minimumDate.Value Then dateValue = _minimumDate.Value
            If _maximumDate.HasValue AndAlso dateValue > _maximumDate.Value Then dateValue = _maximumDate.Value
            Return dateValue
        End Function

        Private Function IsMonthAllowed(yearValue As Integer,
                                        monthValue As Integer) As Boolean
            yearValue = Math.Max(1, Math.Min(9999, yearValue))
            monthValue = Math.Max(1, Math.Min(12, monthValue))
            Dim firstDay As New Date(yearValue, monthValue, 1)
            Dim lastDay As New Date(yearValue, monthValue, DateTime.DaysInMonth(yearValue, monthValue))

            If _minimumDate.HasValue AndAlso lastDay < _minimumDate.Value.Date Then Return False
            If _maximumDate.HasValue AndAlso firstDay > _maximumDate.Value.Date Then Return False
            Return True
        End Function

        Private Shared Function NormalizeNullableDate(value As Nullable(Of Date)) As Nullable(Of Date)
            If Not value.HasValue Then Return Nothing
            Return value.Value.Date
        End Function

#End Region

    End Class

End Namespace
