Option Strict On
Option Explicit On

Imports System
Imports System.Globalization
Imports System.Windows.Forms
Imports Nexamas.UI.Architecture
Imports Nexamas.UI.Components.ListPopup
Imports Nexamas.UI.Controls
Imports Nexamas.UI.FloatRuntime
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 Public NotInheritable Class MASDatePicker
#Region "Date Policy And Parsing"

        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


        Friend Shared Function TryParseDateText(text As String,
                                                culture As CultureInfo,
                                                ByRef value As Date) As Boolean
            value = DateTime.MinValue
            Dim raw As String = If(text, String.Empty).Trim()
            If raw.Length = 0 Then Return False

            Dim effectiveCulture As CultureInfo = If(culture, CultureInfo.CurrentCulture)
            Dim parsed As DateTime
            If Not DateTime.TryParse(raw, effectiveCulture, DateTimeStyles.AllowWhiteSpaces, parsed) Then Return False

            value = parsed.Date
            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

        Friend Shared Function FirstOfMonth(value As Date) As Date
            Return New Date(value.Year, value.Month, 1)
        End Function

        Private Shared Function NullableDatesEqual(a As Nullable(Of Date),
                                                   b As Nullable(Of Date)) As Boolean
            If a.HasValue <> b.HasValue Then Return False
            If Not a.HasValue Then Return True
            Return a.Value.Date = b.Value.Date
        End Function

#End Region

    End Class

End Namespace
