' SSOT-V2 Signature: This class/file follows the SSOT-V2 architecture.
Option Strict On
Option Explicit On

Imports System
Imports Nexamas.UI.Architecture
Imports Nexamas.UI.General
Imports Nexamas.UI.Theming
Imports Nexamas.UI.Values
Imports SkiaSharp

Namespace Nexamas.UI.Rendering

    Partial Friend NotInheritable Class MASVisualPrimitivesPainter

#Region "Surface: Acrylic / Crystal"

        Friend Sub DrawAcrylicSurface(canvas As SKCanvas,
                                      ctx As MASThemeContext,
                                      r As SKRect,
                                      dpi As Single,
                                      contract As MASResolvedComponentContract)

            If _disposed Then Return
            If canvas Is Nothing OrElse ctx Is Nothing Then Return
            If contract Is Nothing Then Throw New ArgumentNullException(NameOf(contract))
            If r.Width <= 1 OrElse r.Height <= 1 Then Return

            contract.AssertConsumable()

            Dim m As MASSurfaceInteractionRing.Metrics
            Dim baseRect As SKRect

            If Not MASVisualEffectGeometry.TryResolveBaseRect(r, dpi, m, baseRect) Then Return

            Dim radius As Single = ResolveSurfaceRadiusPx(contract, baseRect, dpi)
            radius = PixelSnap.SafeRadius(radius)

            If MASSurfaceMaterialRuntimeSwitch.IsActive AndAlso
               MASSurfaceTreatmentRuntimeSurfaceVisual.TryDrawMaterialSlotSurfaceVisual(
                   canvas:=canvas,
                   ctx:=ctx,
                   boundsPx:=baseRect,
                   consumerKind:=MASSurfaceTreatmentConsumerKind.CardSurface,
                   slot:=MASSurfaceSlot.Body,
                   materialKey:=MASSurfaceMaterialIds.Auto,
                   dpi:=dpi,
                   cornerRadiusPx:=radius,
                   opacity:=1.0F,
                   fallbackRole:=MASSurfaceRole.Control,
                   requestedFrameStrength:=MASSurfaceFrameStrength.Level3) Then
                Return
            End If

            Dim pal As MASAcrylicEffectPaletteResolver.AcrylicPalette

            If Not MASAcrylicEffectPaletteResolver.TryResolveThemePalette(ctx, contract, pal) Then Return

            _visualResources.CoolAcrylic.DrawCoolAcrylicBody(
                canvas:=canvas,
                baseRect:=baseRect,
                radius:=radius,
                dpi:=dpi,
                fam:=contract.SurfaceFamily,
                topCol:=pal.Top,
                midCol:=pal.Mid,
                botCol:=pal.Bot,
                wash:=pal.Wash,
                borderOuter:=pal.BorderOuter,
                borderInner:=pal.BorderInner)

        End Sub

        Friend Sub DrawAcrylicSurfaceExplicit(canvas As SKCanvas,
                                              r As SKRect,
                                              dpi As Single,
                                              fam As CommonEnums.SurfaceFamily,
                                              radius As Single,
                                              topCol As SKColor,
                                              midCol As SKColor,
                                              botCol As SKColor,
                                              wash As SKColor,
                                              borderOuter As SKColor,
                                              borderInner As SKColor)

            If _disposed Then Return
            If canvas Is Nothing Then Return
            If r.Width <= 1 OrElse r.Height <= 1 Then Return

            Dim m As MASSurfaceInteractionRing.Metrics
            Dim baseRect As SKRect

            If Not MASVisualEffectGeometry.TryResolveBaseRect(r, dpi, m, baseRect) Then Return

            radius = PixelSnap.SafeRadius(radius)

            _visualResources.CoolAcrylic.DrawCoolAcrylicBody(
                canvas:=canvas,
                baseRect:=baseRect,
                radius:=radius,
                dpi:=dpi,
                fam:=fam,
                topCol:=topCol,
                midCol:=midCol,
                botCol:=botCol,
                wash:=wash,
                borderOuter:=borderOuter,
                borderInner:=borderInner)

        End Sub

        Friend Sub DrawCrystalIceSurfaceComposite(canvas As SKCanvas,
                                                   baseRect As SKRect,
                                                   radius As Single,
                                                   dpi As Single,
                                                   fam As CommonEnums.SurfaceFamily,
                                                   topCol As SKColor,
                                                   midCol As SKColor,
                                                   botCol As SKColor,
                                                   wash As SKColor,
                                                   borderOuter As SKColor,
                                                   borderInner As SKColor)

            If _disposed Then Return
            If canvas Is Nothing Then Return
            If baseRect.Width <= 1 OrElse baseRect.Height <= 1 Then Return

            _visualResources.CrystalIce.DrawCrystalIceBody(
                canvas:=canvas,
                baseRect:=baseRect,
                radius:=radius,
                dpi:=dpi,
                fam:=fam,
                topCol:=topCol,
                midCol:=midCol,
                botCol:=botCol,
                wash:=wash)

            DrawCrystalIceCompositeFrame(
                canvas:=canvas,
                baseRect:=baseRect,
                radius:=radius,
                dpi:=dpi,
                midCol:=midCol,
                borderOuter:=borderOuter,
                borderInner:=borderInner)

        End Sub

        Friend Sub DrawCrystalIceBody(canvas As SKCanvas,
                                               baseRect As SKRect,
                                               radius As Single,
                                               dpi As Single,
                                               fam As CommonEnums.SurfaceFamily,
                                               topCol As SKColor,
                                               midCol As SKColor,
                                               botCol As SKColor,
                                               wash As SKColor)

            If _disposed Then Return
            If canvas Is Nothing Then Return
            If baseRect.Width <= 1 OrElse baseRect.Height <= 1 Then Return

            _visualResources.CrystalIce.DrawCrystalIceBody(
                canvas:=canvas,
                baseRect:=baseRect,
                radius:=radius,
                dpi:=dpi,
                fam:=fam,
                topCol:=topCol,
                midCol:=midCol,
                botCol:=botCol,
                wash:=wash)

        End Sub

        Private Shared Sub DrawCrystalIceCompositeFrame(canvas As SKCanvas,
                                                        baseRect As SKRect,
                                                        radius As Single,
                                                        dpi As Single,
                                                        midCol As SKColor,
                                                        borderOuter As SKColor,
                                                        borderInner As SKColor)
            If canvas Is Nothing Then Return
            If baseRect.Width <= 1.0F OrElse baseRect.Height <= 1.0F Then Return

            dpi = PixelSnap.SafeDpi(dpi)
            radius = PixelSnap.SafeRadius(radius)

            Dim outerRim As SKColor =
                ColorMath.WithAlpha(
                    ColorMath.MixLinear(borderOuter, midCol, 0.04F),
                    52)

            Dim innerRim As SKColor =
                ColorMath.WithAlpha(
                    ColorMath.MixLinear(borderInner, midCol, 0.08F),
                    12)

            Dim borderSpec As New MASSurfaceFrameBorderSpec With {
                .OuterColor = outerRim,
                .InnerColor = innerRim,
                .HairlineColor = SKColors.Transparent,
                .GlowColor = SKColors.Transparent,
                .OuterStrokePx = 0.9F,
                .InnerStrokePx = 0.72F,
                .HairlineStrokePx = 0.0F,
                .GlowStrokePx = 0.0F,
                .InnerInsetPx = 1.0F,
                .HairlineAlpha = 0,
                .GlowAlpha = 0,
                .GlowBlurSigmaPx = 0.0F,
                .DrawOuter = outerRim.Alpha > 0,
                .DrawInner = innerRim.Alpha > 0,
                .DrawHairline = False,
                .DrawGlow = False
            }

            Using painter As New MASSurfaceFrameBorderPainter()
                painter.Draw(
                    canvas:=canvas,
                    baseRect:=baseRect,
                    baseRadiusPx:=radius,
                    dpi:=dpi,
                    spec:=MASSurfaceFramePainter.ScaleBorderSpec(borderSpec, dpi))
            End Using
        End Sub

#End Region



    End Class

End Namespace
