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 MASTimePicker
#Region "Layout / Intrinsic Size"

        Friend Function GetPreferredLayoutSize(context As MASLayoutMeasureContext) As SKSize Implements IMASLayoutParticipant.GetPreferredLayoutSize
            Return MeasureIntrinsicSize(CreateSizeContext(context), SizeIntent).DesiredSize
        End Function

        Friend Function GetMinLayoutSize(context As MASLayoutMeasureContext) As SKSize Implements IMASLayoutParticipant.GetMinLayoutSize
            Return MeasureIntrinsicSize(CreateSizeContext(context), SizeIntent).MinSize
        End Function

        Friend Function MeasureIntrinsicSize(context As MASSizeContext,
                                             intent As MASSize) As MASSizeResult Implements IMASIntrinsicSizeContract.MeasureIntrinsicSize
            Dim safeContext As MASSizeContext = MASIntrinsicControlSizeMetrics.EnsureContext(context)
            Dim text As String = If(String.IsNullOrEmpty(DisplayText), _placeholder, DisplayText)
            Dim desiredTextWidth As Single = MeasureIntrinsicText(safeContext, text)
            Dim desired As SKSize = MASIntrinsicControlSizeMetrics.ResolveComboBoxDesiredSize(desiredTextWidth)
            Dim minimum As SKSize = MASIntrinsicControlSizeMetrics.ResolveComboBoxMinimumSize()
            Dim contentInset As MASLayoutInset = MASIntrinsicControlSizeMetrics.CreateComboBoxContentInset()

            Return MASSizeResolver.FromMeasured(
                desiredSize:=desired,
                minSize:=minimum,
                maxSize:=New SKSize(Single.PositiveInfinity, Single.PositiveInfinity),
                intent:=intent,
                context:=safeContext,
                canGrowWidth:=False,
                canGrowHeight:=False,
                contentInset:=contentInset,
                visualOverflowInset:=MASIntrinsicControlSizeMetrics.InputVisualOverflowInset,
                hitOverflowInset:=MASIntrinsicControlSizeMetrics.CreateTouchHitOverflowInset(desired, safeContext.Density),
                isFallback:=False)
        End Function

        Friend Function ResolveLayoutSemanticBounds(outerBounds As SKRect,
                                                    sizeResult As MASSizeResult,
                                                    defaultSlot As MASLayoutSlot) As MASLayoutSemanticBounds Implements IMASLayoutSemanticBoundsProvider.ResolveLayoutSemanticBounds
            Return MASLayoutSemanticBoundsPolicy.ForInputPopupTriggerSurface(defaultSlot)
        End Function

        Private Shared Function MeasureIntrinsicText(context As MASSizeContext, text As String) As Single
            Dim result As MASTextMeasureResult =
                MASLayoutTextMeasureGateway.Measure(
                    If(context Is Nothing, Nothing, context.IntegrationContext),
                    If(text, String.Empty),
                    MASTypography.MASTextStyle.SelectionText,
                    Single.PositiveInfinity,
                    allowWrap:=False)
            Return Math.Max(0.0F, result.Size.Width)
        End Function

        Private Shared Function CreateSizeContext(context As MASLayoutMeasureContext) As MASSizeContext
            If context Is Nothing Then Return MASIntrinsicControlSizeMetrics.EnsureContext(Nothing)
            Return context.ToSizeContext()
        End Function

#End Region

    End Class

End Namespace
