Option Strict On
Option Explicit On

Imports System
Imports System.Collections.Generic
Imports Nexamas.UI.Architecture
Imports Nexamas.UI.Composition
Imports Nexamas.UI.General
Imports Nexamas.UI.Icons
Imports Nexamas.UI.Layout
Imports Nexamas.UI.Rendering
Imports Nexamas.UI.TextInput
Imports Nexamas.UI.TextRendering
Imports Nexamas.UI.Theming
Imports Nexamas.UI.Values
Imports SkiaSharp

Namespace Nexamas.UI.Controls

    Partial Public NotInheritable Class MASStatusBanner

#Region "Layout / 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 titleSize As SKSize = MeasureText(safeContext, ResolveTitleText(), MASTypography.MASTextStyle.Small)
            Dim messageSize As SKSize = MeasureText(safeContext, ResolveMessageText(), MASTypography.MASTextStyle.Body)
            Dim leadingReserve As Single = ResolveLeadingContentReserve()
            Dim textWidth As Single = Math.Max(titleSize.Width, messageSize.Width)
            Dim desiredWidth As Single = Math.Max(StatusBannerTokens.MinWidthDip,
                                                  leadingReserve +
                                                  textWidth +
                                                  StatusBannerTokens.PaddingRightDip)
            Dim textHeight As Single = titleSize.Height + StatusBannerTokens.TitleMessageGapDip + Math.Max(messageSize.Height, StatusBannerTokens.MessageLineHeightDip)
            Dim desiredHeight As Single = Math.Max(StatusBannerTokens.MinHeightDip,
                                                   StatusBannerTokens.PaddingTopDip +
                                                   textHeight +
                                                   StatusBannerTokens.PaddingBottomDip)
            Dim minimum As New SKSize(StatusBannerTokens.MinWidthDip, StatusBannerTokens.MinHeightDip)
            Dim contentInset As New MASLayoutInset(
                ResolveLeadingContentReserve(),
                StatusBannerTokens.PaddingTopDip,
                StatusBannerTokens.PaddingRightDip,
                StatusBannerTokens.PaddingBottomDip)

            Return MASSizeResolver.FromMeasured(
                desiredSize:=New SKSize(desiredWidth, desiredHeight),
                minSize:=minimum,
                maxSize:=New SKSize(Single.PositiveInfinity, Single.PositiveInfinity),
                intent:=intent,
                context:=safeContext,
                canGrowWidth:=True,
                canGrowHeight:=False,
                contentInset:=contentInset,
                visualOverflowInset:=MASLayoutInset.Empty,
                hitOverflowInset:=MASLayoutInset.Empty,
                isFallback:=False)
        End Function

        Private Function MeasureText(context As MASSizeContext,
                                     text As String,
                                     style As MASTypography.MASTextStyle) As SKSize
            Dim result As MASTextMeasureResult =
                MASLayoutTextMeasureGateway.Measure(
                    If(context Is Nothing, Nothing, context.IntegrationContext),
                    If(String.IsNullOrEmpty(text), " ", text),
                    style,
                    Single.PositiveInfinity,
                    allowWrap:=False)

            Return result.Size
        End Function

        Private Function ResolveLeadingContentReserve() As Single
            If _showIcon Then
                Dim plateLeading As Single = StatusBannerTokens.AccentSegmentWithIconWidthDip -
                                             StatusBannerTokens.AccentContentOverlapDip
                Return plateLeading +
                       StatusBannerTokens.IconBadgeDiameterDip / 2.0F +
                       StatusBannerTokens.IconGapDip
            End If

            Return StatusBannerTokens.AccentSegmentWithoutIconWidthDip +
                   StatusBannerTokens.ContentTextInsetDip
        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
