Option Strict On
Option Explicit On

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

Namespace Nexamas.UI.Controls

    Partial Public NotInheritable Class MASTabControl

#Region "Layout"
        Friend Function GetPreferredLayoutSize(context As MASLayoutMeasureContext) As SKSize Implements IMASLayoutParticipant.GetPreferredLayoutSize
            Dim sizeContext As MASSizeContext = CreateSizeContext(context)
            Return MeasureIntrinsicSize(sizeContext, SizeIntent).DesiredSize
        End Function

        Friend Function GetMinLayoutSize(context As MASLayoutMeasureContext) As SKSize Implements IMASLayoutParticipant.GetMinLayoutSize
            Dim sizeContext As MASSizeContext = CreateSizeContext(context)
            Return MeasureIntrinsicSize(sizeContext, 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 desiredWidth As Single = ResolveIntrinsicTabsWidth(safeContext)
            Dim desired As SKSize = MASIntrinsicControlSizeMetrics.ResolveTabsDesiredSize(desiredWidth)
            Dim minimum As SKSize = MASIntrinsicControlSizeMetrics.ResolveTabsMinimumSize()

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

        Private Function ResolveIntrinsicTabsWidth(context As MASSizeContext) As Single
            If _items.Count <= 0 Then Return MASIntrinsicControlSizeMetrics.ResolveTabsEmptyWidth()

            Dim total As Single = MASIntrinsicControlSizeMetrics.ResolveTabsHorizontalPaddingWidth()
            For i As Integer = 0 To _items.Count - 1
                Dim item As MASTabItem = _items(i)
                Dim text As String = If(item Is Nothing, String.Empty, item.Text)
                Dim textMeasure As MASTextMeasureResult =
                    MASLayoutTextMeasureGateway.Measure(
                        If(context Is Nothing, Nothing, context.IntegrationContext),
                        text,
                        MASTypography.MASTextStyle.Body,
                        Single.PositiveInfinity,
                        allowWrap:=False)
                Dim itemWidth As Single = MASIntrinsicControlSizeMetrics.ResolveTabsItemWidth(textMeasure.Size.Width)
                total += itemWidth
                If i > 0 Then total += MASIntrinsicControlSizeMetrics.ResolveTabsItemGap()
            Next
            Return total
        End Function


        Private Shared Function CreateSizeContext(context As MASLayoutMeasureContext) As MASSizeContext
            If context Is Nothing Then
                Return New MASSizeContext(New SKSize(Single.PositiveInfinity, Single.PositiveInfinity))
            End If

            Return context.ToSizeContext()
        End Function

#End Region

    End Class

End Namespace
