Option Strict On
Option Explicit On

Imports System
Imports Nexamas.UI.Theming
Imports SkiaSharp

Namespace Nexamas.UI.Rendering

    ''' <summary>
    ''' Component-facing semantic gateway for Nexamas UI broad surface materials. Components are
    ''' allowed to ask for a Card, Toolbar, Background, Popup, Toast, Progress, or Panel surface;
    ''' only this Visual/Surface owner translates that request into consumer-kind, slot, role,
    ''' frame-strength, and runtime switch routing details.
    ''' </summary>
    Friend NotInheritable Class MASSurfaceMaterialComponentGateway
        Private Shared ReadOnly _frameFallbackPainter As New MASSurfaceFramePainter()

        Private Sub New()
        End Sub

        Friend Shared Function TryDrawCardRootSurface(canvas As SKCanvas,
                                                       ctx As MASThemeContext,
                                                       boundsPx As SKRect,
                                                       materialKey As String,
                                                       dpi As Single,
                                                       cornerRadiusPx As Single,
                                                       Optional opacity As Single = 1.0F,
                                                       Optional surfaceStrengthLevel As Integer = 4,
                                                       Optional borderStrengthLevel As Integer = 3,
                                                       Optional frameStrength As MASSurfaceFrameStrength = MASSurfaceFrameStrength.Level3) As Boolean
            Return TryDrawSlotSurface(canvas, ctx, boundsPx, MASSurfaceTreatmentConsumerKind.CardSurface, materialKey, MASSurfaceSlot.Root, dpi, cornerRadiusPx, opacity, MASSurfaceRole.Card, surfaceStrengthLevel, borderStrengthLevel, frameStrength)
        End Function

        Friend Shared Function TryDrawCardViewportSurface(canvas As SKCanvas,
                                                           ctx As MASThemeContext,
                                                           boundsPx As SKRect,
                                                           materialKey As String,
                                                           dpi As Single,
                                                           cornerRadiusPx As Single,
                                                           Optional opacity As Single = 1.0F,
                                                           Optional surfaceStrengthLevel As Integer = 3,
                                                           Optional borderStrengthLevel As Integer = 2,
                                                           Optional frameStrength As MASSurfaceFrameStrength = MASSurfaceFrameStrength.Level3) As Boolean
            Return TryDrawSlotSurface(canvas, ctx, boundsPx, MASSurfaceTreatmentConsumerKind.CardSurface, materialKey, MASSurfaceSlot.Viewport, dpi, cornerRadiusPx, opacity, MASSurfaceRole.Card, surfaceStrengthLevel, borderStrengthLevel, frameStrength)
        End Function

        Friend Shared Function TryDrawControlBodySurface(canvas As SKCanvas,
                                                          ctx As MASThemeContext,
                                                          boundsPx As SKRect,
                                                          materialKey As String,
                                                          dpi As Single,
                                                          cornerRadiusPx As Single,
                                                          Optional opacity As Single = 1.0F,
                                                          Optional surfaceStrengthLevel As Integer = 3,
                                                          Optional borderStrengthLevel As Integer = 2,
                                                          Optional frameStrength As MASSurfaceFrameStrength = MASSurfaceFrameStrength.Level3) As Boolean
            Return TryDrawSlotSurface(canvas, ctx, boundsPx, MASSurfaceTreatmentConsumerKind.CardSurface, materialKey, MASSurfaceSlot.Body, dpi, cornerRadiusPx, opacity, MASSurfaceRole.Control, surfaceStrengthLevel, borderStrengthLevel, frameStrength)
        End Function

        Friend Shared Function TryDrawActionChromeMaterialBody(canvas As SKCanvas,
                                                                      ctx As MASThemeContext,
                                                                      boundsPx As SKRect,
                                                                      materialKey As String,
                                                                      dpi As Single,
                                                                      cornerRadiusPx As Single,
                                                                      Optional opacity As Single = 1.0F,
                                                                      Optional surfaceStrengthLevel As Integer = 3,
                                                                      Optional frameStrength As MASSurfaceFrameStrength = MASSurfaceFrameStrength.Level3) As Boolean
            ' Action chrome owns button/input/selector color identity. Auto/default material
            ' must not replace semantic chrome bodies because doing so washes out primary,
            ' danger, and dialog action colors. Only explicit material keys may opt in.
            If Not MASSurfaceTreatmentMaterialKeyNormalizer.IsExplicitMaterial(materialKey) Then Return False
            If MASSurfaceMaterialRuntimeSwitch.IsSwitchableDefaultMaterialKey(materialKey) Then Return False

            Return TryDrawRuntimeSurface(canvas, ctx, boundsPx, MASSurfaceTreatmentConsumerKind.CardSurface, materialKey, dpi, cornerRadiusPx, opacity, MASSurfaceRole.Control, surfaceStrengthLevel, 0, frameStrength, True, drawFrame:=False)
        End Function

        Friend Shared Function TryDrawInputFieldMaterialBody(canvas As SKCanvas,
                                                             ctx As MASThemeContext,
                                                             boundsPx As SKRect,
                                                             materialKey As String,
                                                             dpi As Single,
                                                             cornerRadiusPx As Single,
                                                             Optional opacity As Single = 1.0F,
                                                             Optional surfaceStrengthLevel As Integer = 3,
                                                             Optional frameStrength As MASSurfaceFrameStrength = MASSurfaceFrameStrength.Level3) As Boolean
            Return TryDrawRuntimeSurface(canvas, ctx, boundsPx, MASSurfaceTreatmentConsumerKind.CardSurface, materialKey, dpi, cornerRadiusPx, opacity, MASSurfaceRole.Control, surfaceStrengthLevel, 0, frameStrength, False, drawFrame:=False)
        End Function

        Friend Shared Function TryDrawSelectorChromeMaterialBody(canvas As SKCanvas,
                                                                 ctx As MASThemeContext,
                                                                 boundsPx As SKRect,
                                                                 materialKey As String,
                                                                 dpi As Single,
                                                                 cornerRadiusPx As Single,
                                                                 Optional opacity As Single = 1.0F,
                                                                 Optional surfaceStrengthLevel As Integer = 3,
                                                                 Optional frameStrength As MASSurfaceFrameStrength = MASSurfaceFrameStrength.Level3) As Boolean
            Return TryDrawRuntimeSurface(canvas, ctx, boundsPx, MASSurfaceTreatmentConsumerKind.CardSurface, materialKey, dpi, cornerRadiusPx, opacity, MASSurfaceRole.Control, surfaceStrengthLevel, 0, frameStrength, False, drawFrame:=False)
        End Function


        Friend Shared Function TryDrawBackgroundSurface(canvas As SKCanvas,
                                                         ctx As MASThemeContext,
                                                         boundsPx As SKRect,
                                                         materialKey As String,
                                                         dpi As Single,
                                                         Optional cornerRadiusPx As Single = 0.0F,
                                                         Optional opacity As Single = 1.0F,
                                                         Optional surfaceStrengthLevel As Integer = 3,
                                                         Optional borderStrengthLevel As Integer = 1,
                                                         Optional frameStrength As MASSurfaceFrameStrength = MASSurfaceFrameStrength.Level1) As Boolean
            Return TryDrawSlotSurface(canvas, ctx, boundsPx, MASSurfaceTreatmentConsumerKind.BackgroundSurface, materialKey, MASSurfaceSlot.Background, dpi, cornerRadiusPx, opacity, MASSurfaceRole.ApplicationChrome, surfaceStrengthLevel, borderStrengthLevel, frameStrength)
        End Function


        Friend Shared Function TryDrawMediaStageSurface(canvas As SKCanvas,
                                                        ctx As MASThemeContext,
                                                        boundsPx As SKRect,
                                                        materialKey As String,
                                                        dpi As Single,
                                                        cornerRadiusPx As Single,
                                                        Optional opacity As Single = 1.0F,
                                                        Optional surfaceStrengthLevel As Integer = 2,
                                                        Optional borderStrengthLevel As Integer = 1,
                                                        Optional frameStrength As MASSurfaceFrameStrength = MASSurfaceFrameStrength.Level1,
                                                        Optional hasExplicitMaterialOverride As Boolean = True) As Boolean
            Return TryDrawRuntimeSurface(canvas, ctx, boundsPx, MASSurfaceTreatmentConsumerKind.BackgroundSurface, materialKey, dpi, cornerRadiusPx, opacity, MASSurfaceRole.Control, surfaceStrengthLevel, borderStrengthLevel, frameStrength, hasExplicitMaterialOverride)
        End Function

        Friend Shared Function TryDrawToolbarSurface(canvas As SKCanvas,
                                                      ctx As MASThemeContext,
                                                      boundsPx As SKRect,
                                                      materialKey As String,
                                                      dpi As Single,
                                                      cornerRadiusPx As Single,
                                                      Optional opacity As Single = 1.0F,
                                                      Optional surfaceStrengthLevel As Integer = 3,
                                                      Optional borderStrengthLevel As Integer = 2,
                                                      Optional frameStrength As MASSurfaceFrameStrength = MASSurfaceFrameStrength.Level3,
                                                      Optional drawFrame As Boolean = True) As Boolean
            If TryDrawSlotSurface(canvas, ctx, boundsPx, MASSurfaceTreatmentConsumerKind.ToolbarSurface, materialKey, MASSurfaceSlot.Toolbar, dpi, cornerRadiusPx, opacity, MASSurfaceRole.ApplicationChrome, surfaceStrengthLevel, borderStrengthLevel, frameStrength, drawFrame) Then Return True
            Return TryDrawFrameFallback(canvas, ctx, boundsPx, dpi, cornerRadiusPx, surfaceStrengthLevel, borderStrengthLevel)
        End Function

        Friend Shared Function TryDrawTopBarSurface(canvas As SKCanvas,
                                                     ctx As MASThemeContext,
                                                     boundsPx As SKRect,
                                                     materialKey As String,
                                                     dpi As Single,
                                                     cornerRadiusPx As Single,
                                                     Optional opacity As Single = 1.0F,
                                                     Optional surfaceStrengthLevel As Integer = 5,
                                                     Optional borderStrengthLevel As Integer = 4,
                                                     Optional frameStrength As MASSurfaceFrameStrength = MASSurfaceFrameStrength.Level4) As Boolean
            Return TryDrawSlotSurface(canvas, ctx, boundsPx, MASSurfaceTreatmentConsumerKind.TopBarSurface, materialKey, MASSurfaceSlot.Header, dpi, cornerRadiusPx, opacity, MASSurfaceRole.ApplicationChrome, surfaceStrengthLevel, borderStrengthLevel, frameStrength)
        End Function

        Friend Shared Function TryDrawAuthoredMaterialSurface(canvas As SKCanvas,
                                                                    ctx As MASThemeContext,
                                                                    boundsPx As SKRect,
                                                                    materialKey As String,
                                                                    dpi As Single,
                                                                    cornerRadiusPx As Single,
                                                                    surfaceStrengthLevel As Integer,
                                                                    surfaceRole As MASSurfaceRole) As Boolean
            If canvas Is Nothing Then Return False
            If boundsPx.IsEmpty OrElse boundsPx.Width <= 1.0F OrElse boundsPx.Height <= 1.0F Then Return False

            Dim material As IMASSurfaceMaterial = Nothing
            If Not MASSurfaceMaterialRegistry.TryResolve(materialKey, material) Then Return False
            If material Is Nothing Then Return False

            Dim materialContext As MASSurfaceMaterialContext = MASSurfaceMaterialContext.Create(
                dpi:=dpi,
                themeContext:=ctx,
                surfaceStrengthLevel:=surfaceStrengthLevel,
                boundsPx:=boundsPx,
                cornerRadiusPx:=cornerRadiusPx,
                surfaceRole:=surfaceRole)

            material.Draw(canvas, materialContext)
            Return True
        End Function

        Friend Shared Function TryDrawPanelShellSurface(canvas As SKCanvas,
                                                         ctx As MASThemeContext,
                                                         boundsPx As SKRect,
                                                         materialKey As String,
                                                         dpi As Single,
                                                         cornerRadiusPx As Single,
                                                         Optional opacity As Single = 1.0F,
                                                         Optional surfaceStrengthLevel As Integer = 4,
                                                         Optional borderStrengthLevel As Integer = 3,
                                                         Optional frameStrength As MASSurfaceFrameStrength = MASSurfaceFrameStrength.Level3,
                                                         Optional visualStyle As MASSurfaceVisualStyle = Nothing,
                                                         Optional hasExplicitMaterialOverride As Boolean = True) As Boolean
            If TryDrawRuntimeSurface(canvas, ctx, boundsPx, MASSurfaceTreatmentConsumerKind.PanelShellSurface, materialKey, dpi, cornerRadiusPx, opacity, ResolvePanelShellRole(visualStyle), surfaceStrengthLevel, borderStrengthLevel, frameStrength, hasExplicitMaterialOverride) Then Return True
            Return TryDrawFrameFallback(canvas, ctx, boundsPx, dpi, cornerRadiusPx, surfaceStrengthLevel, borderStrengthLevel)
        End Function

        Friend Shared Function TryDrawPopupSurface(canvas As SKCanvas,
                                                    ctx As MASThemeContext,
                                                    boundsPx As SKRect,
                                                    materialKey As String,
                                                    dpi As Single,
                                                    cornerRadiusPx As Single,
                                                    Optional opacity As Single = 1.0F,
                                                    Optional surfaceStrengthLevel As Integer = 5,
                                                    Optional borderStrengthLevel As Integer = 4,
                                                    Optional frameStrength As MASSurfaceFrameStrength = MASSurfaceFrameStrength.Level4) As Boolean
            Return TryDrawRuntimeSurface(canvas, ctx, boundsPx, MASSurfaceTreatmentConsumerKind.PanelShellSurface, materialKey, dpi, cornerRadiusPx, opacity, MASSurfaceRole.Popup, surfaceStrengthLevel, borderStrengthLevel, frameStrength, False)
        End Function

        Friend Shared Function TryDrawGroupBoxSurface(canvas As SKCanvas,
                                                       ctx As MASThemeContext,
                                                       boundsPx As SKRect,
                                                       materialKey As String,
                                                       dpi As Single,
                                                       cornerRadiusPx As Single,
                                                       Optional opacity As Single = 1.0F,
                                                       Optional surfaceStrengthLevel As Integer = 4,
                                                       Optional borderStrengthLevel As Integer = 3,
                                                       Optional frameStrength As MASSurfaceFrameStrength = MASSurfaceFrameStrength.Level3) As Boolean
            Return TryDrawSlotSurface(canvas, ctx, boundsPx, MASSurfaceTreatmentConsumerKind.GroupBoxSurface, materialKey, MASSurfaceSlot.Root, dpi, cornerRadiusPx, opacity, MASSurfaceRole.PanelShell, surfaceStrengthLevel, borderStrengthLevel, frameStrength)
        End Function

        Friend Shared Function TryDrawFloatingTooltipSurface(canvas As SKCanvas,
                                                              ctx As MASThemeContext,
                                                              boundsPx As SKRect,
                                                              materialKey As String,
                                                              dpi As Single,
                                                              cornerRadiusPx As Single,
                                                              Optional opacity As Single = 1.0F,
                                                              Optional surfaceStrengthLevel As Integer = 4,
                                                              Optional borderStrengthLevel As Integer = 3,
                                                              Optional frameStrength As MASSurfaceFrameStrength = MASSurfaceFrameStrength.Level3) As Boolean
            Return TryDrawSlotSurface(canvas, ctx, boundsPx, MASSurfaceTreatmentConsumerKind.TooltipSurface, materialKey, MASSurfaceSlot.Floating, dpi, cornerRadiusPx, opacity, MASSurfaceRole.Popup, surfaceStrengthLevel, borderStrengthLevel, frameStrength)
        End Function

        Friend Shared Function TryDrawFloatingToastSurface(canvas As SKCanvas,
                                                            ctx As MASThemeContext,
                                                            boundsPx As SKRect,
                                                            materialKey As String,
                                                            dpi As Single,
                                                            cornerRadiusPx As Single,
                                                            Optional opacity As Single = 1.0F,
                                                            Optional surfaceStrengthLevel As Integer = 6,
                                                            Optional borderStrengthLevel As Integer = 6,
                                                            Optional frameStrength As MASSurfaceFrameStrength = MASSurfaceFrameStrength.Level6) As Boolean
            Return TryDrawSlotSurface(canvas, ctx, boundsPx, MASSurfaceTreatmentConsumerKind.ToastSurface, materialKey, MASSurfaceSlot.Floating, dpi, cornerRadiusPx, opacity, MASSurfaceRole.Toast, surfaceStrengthLevel, borderStrengthLevel, frameStrength)
        End Function

        Friend Shared Function TryDrawProgressSurface(canvas As SKCanvas,
                                                       ctx As MASThemeContext,
                                                       boundsPx As SKRect,
                                                       materialKey As String,
                                                       dpi As Single,
                                                       cornerRadiusPx As Single,
                                                       hasExplicitMaterialOverride As Boolean,
                                                       Optional opacity As Single = 1.0F,
                                                       Optional surfaceStrengthLevel As Integer = 3,
                                                       Optional borderStrengthLevel As Integer = 2,
                                                       Optional frameStrength As MASSurfaceFrameStrength = MASSurfaceFrameStrength.Level3) As Boolean
            If TryDrawRuntimeSurface(canvas, ctx, boundsPx, MASSurfaceTreatmentConsumerKind.ProgressSurface, materialKey, dpi, cornerRadiusPx, opacity, MASSurfaceRole.Control, surfaceStrengthLevel, borderStrengthLevel, frameStrength, hasExplicitMaterialOverride) Then Return True
            Return TryDrawFrameFallback(canvas, ctx, boundsPx, dpi, cornerRadiusPx, surfaceStrengthLevel, borderStrengthLevel)
        End Function




        Friend Shared Function TryDrawComposedCardSurface(canvas As SKCanvas,
                                                         ctx As MASThemeContext,
                                                         boundsPx As SKRect,
                                                         composition As MASComponentSurfaceMaterialComposition,
                                                         region As MASComponentSurfaceRegion,
                                                         fallbackMaterialKey As String,
                                                         dpi As Single,
                                                         cornerRadiusPx As Single,
                                                         Optional opacity As Single = 1.0F,
                                                         Optional surfaceStrengthLevel As Integer = 4,
                                                         Optional borderStrengthLevel As Integer = 3,
                                                         Optional frameStrength As MASSurfaceFrameStrength = MASSurfaceFrameStrength.Level3,
                                                         Optional fallbackRole As MASSurfaceRole = MASSurfaceRole.Card) As Boolean
            Dim binding As MASComponentSurfaceMaterialBinding = ResolveRegionBinding(composition, region, fallbackMaterialKey)
            Return TryDrawSlotSurface(
                canvas:=canvas,
                ctx:=ctx,
                boundsPx:=boundsPx,
                consumerKind:=MASSurfaceTreatmentConsumerKind.CardSurface,
                materialKey:=binding.MaterialKey,
                slot:=ToSurfaceSlot(region),
                dpi:=dpi,
                cornerRadiusPx:=cornerRadiusPx,
                opacity:=opacity,
                role:=fallbackRole,
                surfaceStrengthLevel:=surfaceStrengthLevel,
                borderStrengthLevel:=borderStrengthLevel,
                frameStrength:=frameStrength)
        End Function

        Friend Shared Function TryDrawComposedCardRootSurface(canvas As SKCanvas,
                                                             ctx As MASThemeContext,
                                                             boundsPx As SKRect,
                                                             composition As MASComponentSurfaceMaterialComposition,
                                                             region As MASComponentSurfaceRegion,
                                                             fallbackMaterialKey As String,
                                                             dpi As Single,
                                                             cornerRadiusPx As Single,
                                                             Optional opacity As Single = 1.0F,
                                                             Optional surfaceStrengthLevel As Integer = 4,
                                                             Optional borderStrengthLevel As Integer = 3,
                                                             Optional frameStrength As MASSurfaceFrameStrength = MASSurfaceFrameStrength.Level3) As Boolean
            Dim binding As MASComponentSurfaceMaterialBinding = ResolveRegionBinding(composition, region, fallbackMaterialKey)
            Return TryDrawCardRootSurface(
                canvas:=canvas,
                ctx:=ctx,
                boundsPx:=boundsPx,
                materialKey:=binding.MaterialKey,
                dpi:=dpi,
                cornerRadiusPx:=cornerRadiusPx,
                opacity:=opacity,
                surfaceStrengthLevel:=surfaceStrengthLevel,
                borderStrengthLevel:=borderStrengthLevel,
                frameStrength:=frameStrength)
        End Function

        Friend Shared Function TryDrawComposedCardViewportSurface(canvas As SKCanvas,
                                                                 ctx As MASThemeContext,
                                                                 boundsPx As SKRect,
                                                                 composition As MASComponentSurfaceMaterialComposition,
                                                                 region As MASComponentSurfaceRegion,
                                                                 fallbackMaterialKey As String,
                                                                 dpi As Single,
                                                                 cornerRadiusPx As Single,
                                                                 Optional opacity As Single = 1.0F,
                                                                 Optional surfaceStrengthLevel As Integer = 3,
                                                                 Optional borderStrengthLevel As Integer = 2,
                                                                 Optional frameStrength As MASSurfaceFrameStrength = MASSurfaceFrameStrength.Level3) As Boolean
            Dim binding As MASComponentSurfaceMaterialBinding = ResolveRegionBinding(composition, region, fallbackMaterialKey)
            Return TryDrawCardViewportSurface(
                canvas:=canvas,
                ctx:=ctx,
                boundsPx:=boundsPx,
                materialKey:=binding.MaterialKey,
                dpi:=dpi,
                cornerRadiusPx:=cornerRadiusPx,
                opacity:=opacity,
                surfaceStrengthLevel:=surfaceStrengthLevel,
                borderStrengthLevel:=borderStrengthLevel,
                frameStrength:=frameStrength)
        End Function

        Friend Shared Function TryDrawComposedToolbarSurface(canvas As SKCanvas,
                                                            ctx As MASThemeContext,
                                                            boundsPx As SKRect,
                                                            composition As MASComponentSurfaceMaterialComposition,
                                                            region As MASComponentSurfaceRegion,
                                                            fallbackMaterialKey As String,
                                                            dpi As Single,
                                                            cornerRadiusPx As Single,
                                                            Optional opacity As Single = 1.0F,
                                                            Optional surfaceStrengthLevel As Integer = 3,
                                                            Optional borderStrengthLevel As Integer = 2,
                                                            Optional frameStrength As MASSurfaceFrameStrength = MASSurfaceFrameStrength.Level3,
                                                            Optional drawFrame As Boolean = True) As Boolean
            Dim binding As MASComponentSurfaceMaterialBinding = ResolveRegionBinding(composition, region, fallbackMaterialKey)
            Return TryDrawToolbarSurface(
                canvas:=canvas,
                ctx:=ctx,
                boundsPx:=boundsPx,
                materialKey:=binding.MaterialKey,
                dpi:=dpi,
                cornerRadiusPx:=cornerRadiusPx,
                opacity:=opacity,
                surfaceStrengthLevel:=surfaceStrengthLevel,
                borderStrengthLevel:=borderStrengthLevel,
                frameStrength:=frameStrength,
                drawFrame:=drawFrame)
        End Function

        Friend Shared Function TryDrawComposedMediaStageSurface(canvas As SKCanvas,
                                                               ctx As MASThemeContext,
                                                               boundsPx As SKRect,
                                                               composition As MASComponentSurfaceMaterialComposition,
                                                               region As MASComponentSurfaceRegion,
                                                               fallbackMaterialKey As String,
                                                               dpi As Single,
                                                               cornerRadiusPx As Single,
                                                               Optional opacity As Single = 1.0F,
                                                               Optional surfaceStrengthLevel As Integer = 2,
                                                               Optional borderStrengthLevel As Integer = 1,
                                                               Optional frameStrength As MASSurfaceFrameStrength = MASSurfaceFrameStrength.Level1) As Boolean
            Dim binding As MASComponentSurfaceMaterialBinding = ResolveRegionBinding(composition, region, fallbackMaterialKey)
            Return TryDrawMediaStageSurface(
                canvas:=canvas,
                ctx:=ctx,
                boundsPx:=boundsPx,
                materialKey:=binding.MaterialKey,
                dpi:=dpi,
                cornerRadiusPx:=cornerRadiusPx,
                opacity:=opacity,
                surfaceStrengthLevel:=surfaceStrengthLevel,
                borderStrengthLevel:=borderStrengthLevel,
                frameStrength:=frameStrength,
                hasExplicitMaterialOverride:=binding.HasExplicitMaterialOverride)
        End Function

        Friend Shared Function ResolvePanelShellRuntimeMaterialKey(materialKey As String,
                                                                   borderStrengthLevel As Integer,
                                                                   hasExplicitMaterialOverride As Boolean) As String
            Return MASSurfaceTreatmentRuntimeSurfaceVisual.ResolveRuntimeMaterialKey(
                consumerKind:=MASSurfaceTreatmentConsumerKind.PanelShellSurface,
                materialKey:=materialKey,
                requestedFrameStrength:=ToFrameStrength(borderStrengthLevel),
                hasExplicitMaterialOverride:=hasExplicitMaterialOverride)
        End Function

        Friend Shared Function CreatePanelShellHeaderChromeContext(themeContext As MASThemeContext,
                                                                  surfaceTheme As MASSurfaceThemeProfile,
                                                                  materialKey As String,
                                                                  boundsPx As SKRect,
                                                                  baseBoundsPx As SKRect,
                                                                  cornerRadiusPx As Single,
                                                                  borderStrengthLevel As Integer,
                                                                  surfaceStrengthLevel As Integer,
                                                                  dpi As Single,
                                                                  visualStyle As MASSurfaceVisualStyle,
                                                                  Optional visualState As MASSurfaceVisualState = MASSurfaceVisualState.Normal) As MASSurfaceChromeContext
            Return New MASSurfaceChromeContext(
                themeContext:=themeContext,
                surfaceTheme:=surfaceTheme,
                materialId:=materialKey,
                boundsPx:=boundsPx,
                baseBoundsPx:=baseBoundsPx,
                cornerRadiusPx:=cornerRadiusPx,
                borderStrengthLevel:=borderStrengthLevel,
                surfaceStrengthLevel:=surfaceStrengthLevel,
                dpi:=dpi,
                surfaceRole:=ResolvePanelShellRole(visualStyle),
                visualState:=visualState)
        End Function

        Friend Shared Function ToFrameStrength(level As Integer) As MASSurfaceFrameStrength
            If level <= 1 Then Return MASSurfaceFrameStrength.Level1
            If level = 2 Then Return MASSurfaceFrameStrength.Level2
            If level = 3 Then Return MASSurfaceFrameStrength.Level3
            If level = 4 Then Return MASSurfaceFrameStrength.Level4
            If level = 5 Then Return MASSurfaceFrameStrength.Level5
            Return MASSurfaceFrameStrength.Level6
        End Function


        Private Shared Function ResolvePanelShellRole(visualStyle As MASSurfaceVisualStyle) As MASSurfaceRole
            If visualStyle Is Nothing Then Return MASSurfaceRole.PanelShell
            Return visualStyle.SurfaceRole
        End Function




        Private Shared Function ToSurfaceSlot(region As MASComponentSurfaceRegion) As MASSurfaceSlot
            Select Case region
                Case MASComponentSurfaceRegion.Background
                    Return MASSurfaceSlot.Background
                Case MASComponentSurfaceRegion.Header
                    Return MASSurfaceSlot.Header
                Case MASComponentSurfaceRegion.Body
                    Return MASSurfaceSlot.Body
                Case MASComponentSurfaceRegion.Content
                    Return MASSurfaceSlot.Content
                Case MASComponentSurfaceRegion.Footer
                    Return MASSurfaceSlot.Footer
                Case MASComponentSurfaceRegion.Toolbar
                    Return MASSurfaceSlot.Toolbar
                Case MASComponentSurfaceRegion.Chrome
                    Return MASSurfaceSlot.Chrome
                Case MASComponentSurfaceRegion.Overlay
                    Return MASSurfaceSlot.Overlay
                Case MASComponentSurfaceRegion.Floating
                    Return MASSurfaceSlot.Floating
                Case MASComponentSurfaceRegion.Item
                    Return MASSurfaceSlot.Item
                Case MASComponentSurfaceRegion.SelectedItem
                    Return MASSurfaceSlot.SelectedItem
                Case MASComponentSurfaceRegion.Viewport
                    Return MASSurfaceSlot.Viewport
                Case MASComponentSurfaceRegion.Badge
                    Return MASSurfaceSlot.Badge
                Case MASComponentSurfaceRegion.Separator
                    Return MASSurfaceSlot.Separator
                Case Else
                    Return MASSurfaceSlot.Root
            End Select
        End Function

        Private Shared Function ResolveRegionBinding(composition As MASComponentSurfaceMaterialComposition,
                                                     region As MASComponentSurfaceRegion,
                                                     fallbackMaterialKey As String) As MASComponentSurfaceMaterialBinding
            If composition Is Nothing Then
                Return MASComponentSurfaceMaterialBinding.InheritApplication(region)
            End If

            Return composition.Resolve(region, fallbackMaterialKey)
        End Function

        Private Shared Function TryDrawSlotSurface(canvas As SKCanvas,
                                                   ctx As MASThemeContext,
                                                   boundsPx As SKRect,
                                                   consumerKind As MASSurfaceTreatmentConsumerKind,
                                                   materialKey As String,
                                                   slot As MASSurfaceSlot,
                                                   dpi As Single,
                                                   cornerRadiusPx As Single,
                                                   opacity As Single,
                                                   role As MASSurfaceRole,
                                                   surfaceStrengthLevel As Integer,
                                                   borderStrengthLevel As Integer,
                                                   frameStrength As MASSurfaceFrameStrength,
                                                   Optional drawFrame As Boolean = True) As Boolean
            Return MASSurfaceTreatmentRuntimeSurfaceVisual.TryDrawMaterialSlotSurfaceVisual(
                canvas:=canvas,
                ctx:=ctx,
                boundsPx:=boundsPx,
                consumerKind:=consumerKind,
                materialKey:=materialKey,
                slot:=slot,
                dpi:=dpi,
                cornerRadiusPx:=cornerRadiusPx,
                opacity:=opacity,
                surfaceRole:=role,
                surfaceStrengthLevel:=surfaceStrengthLevel,
                borderStrengthLevel:=borderStrengthLevel,
                requestedFrameStrength:=frameStrength,
                drawFrame:=drawFrame)
        End Function

        Private Shared Function TryDrawFrameFallback(canvas As SKCanvas,
                                                     ctx As MASThemeContext,
                                                     boundsPx As SKRect,
                                                     dpi As Single,
                                                     cornerRadiusPx As Single,
                                                     surfaceStrengthLevel As Integer,
                                                     borderStrengthLevel As Integer) As Boolean
            If canvas Is Nothing OrElse ctx Is Nothing Then Return False
            If boundsPx.IsEmpty OrElse boundsPx.Width <= 1.0F OrElse boundsPx.Height <= 1.0F Then Return False

            Dim surfaceTheme As MASSurfaceThemeProfile = MASSurfaceThemeProfileResolver.Resolve(ctx)
            If surfaceTheme Is Nothing Then Return False

            _frameFallbackPainter.Draw(
                canvas:=canvas,
                r:=boundsPx,
                radius:=cornerRadiusPx,
                dpi:=dpi,
                surfaceTheme:=surfaceTheme.Frame,
                surfaceStrength:=ToFrameStrength(surfaceStrengthLevel),
                borderStrength:=ToFrameStrength(borderStrengthLevel))
            Return True
        End Function

        Private Shared Function TryDrawRuntimeSurface(canvas As SKCanvas,
                                                      ctx As MASThemeContext,
                                                      boundsPx As SKRect,
                                                      consumerKind As MASSurfaceTreatmentConsumerKind,
                                                      materialKey As String,
                                                      dpi As Single,
                                                      cornerRadiusPx As Single,
                                                      opacity As Single,
                                                      role As MASSurfaceRole,
                                                      surfaceStrengthLevel As Integer,
                                                      borderStrengthLevel As Integer,
                                                      frameStrength As MASSurfaceFrameStrength,
                                                      hasExplicitMaterialOverride As Boolean,
                                                      Optional drawFrame As Boolean = True) As Boolean
            Return MASSurfaceTreatmentRuntimeSurfaceVisual.TryDrawRuntimeSurfaceVisual(
                canvas:=canvas,
                ctx:=ctx,
                boundsPx:=boundsPx,
                consumerKind:=consumerKind,
                materialKey:=materialKey,
                dpi:=dpi,
                cornerRadiusPx:=cornerRadiusPx,
                opacity:=opacity,
                surfaceRole:=role,
                surfaceStrengthLevel:=surfaceStrengthLevel,
                borderStrengthLevel:=borderStrengthLevel,
                requestedFrameStrength:=frameStrength,
                hasExplicitMaterialOverride:=hasExplicitMaterialOverride,
                drawFrame:=drawFrame)
        End Function
    End Class

End Namespace
