Option Strict On
Option Explicit On

Imports Nexamas.UI.Composition
Imports Nexamas.UI.Layout
Imports Nexamas.UI.Theming
Imports Nexamas.UI.Values
Imports SkiaSharp

Namespace Nexamas.UI.Components

    Partial Public MustInherit Class MASInputBoxSkiaBase

#Region "Composition layout participant"

        ''' <summary>
        ''' Returns the preferred logical size for Composition Auto layout.
        ''' The answer is the same desired size produced by the official MASSize intrinsic contract.
        ''' </summary>
        Friend Function GetPreferredLayoutSize(context As MASLayoutMeasureContext) As SKSize Implements IMASLayoutParticipant.GetPreferredLayoutSize
            Return MeasureIntrinsicSize(CreateSizeContextFromLayoutContext(context), SizeIntent).DesiredSize
        End Function

        ''' <summary>
        ''' Returns the minimum logical size for Composition layout constraints through the same MASSize intrinsic contract.
        ''' </summary>
        Friend Function GetMinLayoutSize(context As MASLayoutMeasureContext) As SKSize Implements IMASLayoutParticipant.GetMinLayoutSize
            Return MeasureIntrinsicSize(CreateSizeContextFromLayoutContext(context), SizeIntent).MinSize
        End Function




        ''' <summary>
        ''' Converts a Composition measurement context into the MASSize context used by the intrinsic contract.
        ''' This prevents text input controls from owning a second measurement path.
        ''' </summary>
        Private Shared Function CreateSizeContextFromLayoutContext(context As MASLayoutMeasureContext) As MASSizeContext
            If context Is Nothing Then
                Return MASIntrinsicControlSizeMetrics.EnsureContext(Nothing)
            End If

            Return New MASSizeContext(context.AvailableSize)
        End Function

        Friend Function MeasureIntrinsicSize(context As MASSizeContext, intent As MASSize) As MASSizeResult Implements IMASIntrinsicSizeContract.MeasureIntrinsicSize
            Dim safeContext As MASSizeContext = MASIntrinsicControlSizeMetrics.EnsureContext(context)
            Dim multiline As Boolean = _multilineController.Enabled
            Dim desired As SKSize = MASIntrinsicControlSizeMetrics.ResolveTextInputDesiredSize(safeContext.AvailableSize, multiline)
            Dim minimum As SKSize = MASIntrinsicControlSizeMetrics.ResolveTextInputMinimumSize(multiline)
            Dim contentInset As MASLayoutInset = MASIntrinsicControlSizeMetrics.CreateTextInputContentInset(HasLeftIcon, RightReservedWidthDip)

            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.CreateVerticalTouchHitOverflowInset(desired, safeContext.Density),
                isFallback:=False)
        End Function
#End Region

    End Class

End Namespace
