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 "Rendering / entry point"

        Private Structure StatusBannerChromeLayout
            Friend AccentRect As SKRect
            Friend ContentPlateRect As SKRect
            Friend IconBadgeRect As SKRect
            Friend TextRect As SKRect
            Friend HasContentPlate As Boolean
            Friend HasBadge As Boolean
            Friend IsRtl As Boolean
        End Structure

        Private Structure StatusBannerSurfaceGeometry
            Friend Bounds As SKRect
            Friend Radius As Single
            Friend Dpi As Single
            Friend HasValue As Boolean
        End Structure

        Protected Overrides Sub Render(canvas As SKCanvas,
                                       ctx As MASThemeContext,
                                       pixelBounds As SKRect)
            If canvas Is Nothing OrElse ctx Is Nothing Then Return
            If pixelBounds.Width <= 1.0F OrElse pixelBounds.Height <= 1.0F Then Return

            Dim pixelDpi As Single = PixelSnap.SafeDpi(ctx.Dpi)
            Dim bannerRect As SKRect = PixelSnap.SnapRect(pixelBounds, pixelDpi)
            If bannerRect.Width <= 1.0F OrElse bannerRect.Height <= 1.0F Then Return

            Dim renderBounds As SKRect = ResolveStatusBannerRevealBounds(bannerRect, pixelDpi)
            Dim plan As MASStatusBannerLayoutPlan = MASStatusBannerLayoutPlan.Create(ctx, renderBounds, SizeIntent, _showIcon)
            Dim dpi As Single = plan.MetricDpi
            _primitives.DrawCardSurface(canvas, ctx, renderBounds, pixelDpi, _contract, MASCardVisualStyle.Secondary)

            Dim surface As StatusBannerSurfaceGeometry = ResolveStatusBannerSurfaceGeometry(renderBounds, dpi)
            If Not surface.HasValue Then Return

            Dim toneColor As SKColor = MASStatusBannerVisualPolicy.ResolveToneColor(ctx, _tone)
            toneColor = ApplyStatusBannerRevealAlpha(toneColor)
            If Not Enabled Then toneColor = toneColor.WithAlpha(StatusBannerTokens.DisabledAccentAlpha)

            Dim titleText As String = ResolveTitleText()
            Dim messageText As String = ResolveMessageText()
            Dim isRtl As Boolean = MASStatusBannerVisualPolicy.ResolveTextIsRtl(titleText, messageText)
            Dim layout As StatusBannerChromeLayout = ResolveChromeLayout(surface.Bounds, plan.ShowIcon, isRtl, surface.Dpi)

            DrawSemanticWash(canvas, surface, toneColor)
            DrawIntegratedAccentPanel(canvas, surface, layout.AccentRect, toneColor, isRtl)
            DrawContentPlate(canvas, ctx, surface, layout, toneColor)
            DrawStatusBannerFrame(canvas, ctx, surface)
            DrawContent(canvas, ctx, layout, toneColor, titleText, messageText, isRtl, surface.Dpi)
        End Sub

#End Region


    End Class

End Namespace
