Option Strict On
Option Explicit On

Imports Nexamas.UI.Theming
Imports SkiaSharp

Namespace Nexamas.UI.Rendering

    Friend NotInheritable Class MASSurfaceMaterialThemeResolver

        Private Sub New()
        End Sub

        Friend Shared Function Resolve(materialId As String,
                                       context As MASSurfaceMaterialContext) As MASSurfaceMaterialPalette

            If context Is Nothing OrElse context.SurfaceTheme Is Nothing Then
                Return CreateFallback(
                    materialId:=materialId,
                    surfaceStrengthLevel:=If(context Is Nothing, 3, context.SurfaceStrengthLevel))
            End If

            Dim materialTheme As MASSurfaceMaterialThemeProfile = context.SurfaceTheme.Material

            Dim topBase As SKColor = materialTheme.Top
            Dim midBase As SKColor = materialTheme.Mid
            Dim bottomBase As SKColor = materialTheme.Bottom
            Dim accent As SKColor = materialTheme.Accent
            Dim line As SKColor = materialTheme.Line
            Dim glow As SKColor = materialTheme.Glow
            Dim innerRim As SKColor = materialTheme.HeaderInnerRim

            Dim strength As Single =
                MASSurfaceMaterialPaintUtils.LevelFactor(
                    context.SurfaceStrengthLevel,
                    0.0F,
                    1.0F)

            Select Case If(materialId, String.Empty).Trim().ToLowerInvariant()

                Case MASSurfaceMaterialIds.SoftMist
                    Return New MASSurfaceMaterialPalette(
                        top:=MASSurfaceMaterialPaintUtils.Mix(topBase, SKColors.White, 0.22F + strength * 0.12F, 242),
                        mid:=MASSurfaceMaterialPaintUtils.Mix(midBase, SKColors.White, 0.1F + strength * 0.08F, 239),
                        bottom:=MASSurfaceMaterialPaintUtils.Mix(bottomBase, SKColors.Black, 0.03F + strength * 0.025F, 232),
                        accent:=accent,
                        line:=MASSurfaceMaterialPaintUtils.WithAlpha(line, CByte(42 + CInt(strength * 28))),
                        glow:=MASSurfaceMaterialPaintUtils.WithAlpha(glow, CByte(60 + CInt(strength * 36))))

                Case MASSurfaceMaterialIds.FrostedGlass
                    Return New MASSurfaceMaterialPalette(
                        top:=MASSurfaceMaterialPaintUtils.Mix(topBase, SKColors.White, 0.34F + strength * 0.08F, 212),
                        mid:=MASSurfaceMaterialPaintUtils.Mix(midBase, accent, 0.08F + strength * 0.05F, 196),
                        bottom:=MASSurfaceMaterialPaintUtils.Mix(bottomBase, SKColors.White, 0.18F, 188),
                        accent:=accent,
                        line:=MASSurfaceMaterialPaintUtils.WithAlpha(line, CByte(75 + CInt(strength * 30))),
                        glow:=MASSurfaceMaterialPaintUtils.WithAlpha(glow, CByte(95 + CInt(strength * 34))))

                Case MASSurfaceMaterialIds.CrystalIce
                    Dim ice As SKColor =
                        MASSurfaceMaterialPaintUtils.Mix(topBase, SKColors.White, 0.52F, 220)

                    Return New MASSurfaceMaterialPalette(
                        top:=MASSurfaceMaterialPaintUtils.Mix(topBase, SKColors.White, 0.46F + strength * 0.08F, 226),
                        mid:=MASSurfaceMaterialPaintUtils.Mix(ice, accent, 0.05F + strength * 0.035F, 206),
                        bottom:=MASSurfaceMaterialPaintUtils.Mix(bottomBase, accent, 0.16F + strength * 0.08F, 214),
                        accent:=accent,
                        line:=MASSurfaceMaterialPaintUtils.WithAlpha(line, CByte(30 + CInt(strength * 24))),
                        glow:=MASSurfaceMaterialPaintUtils.WithAlpha(glow, CByte(72 + CInt(strength * 30))))

                Case MASSurfaceMaterialIds.CrystalIceNative
                    Return New MASSurfaceMaterialPalette(
                        top:=New SKColor(236, 250, 255, CByte(222 + CInt(strength * 12))),
                        mid:=New SKColor(205, 234, 255, CByte(204 + CInt(strength * 8))),
                        bottom:=New SKColor(170, 205, 236, CByte(210 + CInt(strength * 10))),
                        accent:=New SKColor(80, 175, 255, 255),
                        line:=New SKColor(255, 255, 255, CByte(30 + CInt(strength * 24))),
                        glow:=New SKColor(180, 230, 255, CByte(72 + CInt(strength * 30))))

                Case MASSurfaceMaterialIds.WarmPaper
                    Dim warm As SKColor = New SKColor(255, 244, 220, 255)

                    Return New MASSurfaceMaterialPalette(
                        top:=MASSurfaceMaterialPaintUtils.Mix(topBase, warm, 0.5F + strength * 0.18F, 244),
                        mid:=MASSurfaceMaterialPaintUtils.Mix(midBase, warm, 0.42F + strength * 0.18F, 240),
                        bottom:=MASSurfaceMaterialPaintUtils.Mix(bottomBase, warm, 0.32F + strength * 0.16F, 238),
                        accent:=accent,
                        line:=MASSurfaceMaterialPaintUtils.Mix(accent, New SKColor(140, 108, 64), 0.5F, 16),
                        glow:=MASSurfaceMaterialPaintUtils.WithAlpha(warm, CByte(38 + CInt(strength * 24))))

                Case MASSurfaceMaterialIds.WarmPaperNative
                    Return New MASSurfaceMaterialPalette(
                        top:=New SKColor(255, 251, 240, CByte(242 + CInt(strength * 8))),
                        mid:=New SKColor(249, 241, 223, CByte(238 + CInt(strength * 8))),
                        bottom:=New SKColor(239, 225, 202, CByte(236 + CInt(strength * 8))),
                        accent:=New SKColor(166, 116, 48, 255),
                        line:=New SKColor(140, 108, 64, CByte(14 + CInt(strength * 8))),
                        glow:=New SKColor(255, 244, 220, CByte(38 + CInt(strength * 24))))

                Case MASSurfaceMaterialIds.GraphiteMetal
                    Dim darkTop As SKColor = MASSurfaceMaterialPaintUtils.Mix(bottomBase, SKColors.Black, 0.52F, 246)
                    Dim darkMid As SKColor = MASSurfaceMaterialPaintUtils.Mix(bottomBase, SKColors.Black, 0.66F, 246)
                    Dim darkBottom As SKColor = MASSurfaceMaterialPaintUtils.Mix(bottomBase, SKColors.Black, 0.78F, 248)

                    Return New MASSurfaceMaterialPalette(
                        top:=MASSurfaceMaterialPaintUtils.Mix(darkTop, accent, 0.05F + strength * 0.05F, 242),
                        mid:=MASSurfaceMaterialPaintUtils.Mix(darkMid, accent, 0.035F + strength * 0.04F, 242),
                        bottom:=MASSurfaceMaterialPaintUtils.Mix(darkBottom, accent, 0.025F + strength * 0.035F, 244),
                        accent:=accent,
                        line:=MASSurfaceMaterialPaintUtils.WithAlpha(line, CByte(14 + CInt(strength * 12))),
                        glow:=MASSurfaceMaterialPaintUtils.WithAlpha(accent, CByte(24 + CInt(strength * 24))))

                Case MASSurfaceMaterialIds.MediaShell
                    Return CreateMediaGalleryShellPalette(
                        topBase:=topBase,
                        midBase:=midBase,
                        bottomBase:=bottomBase,
                        accent:=accent,
                        line:=line,
                        surfaceStrengthLevel:=context.SurfaceStrengthLevel)

                Case MASSurfaceMaterialIds.MediaToolbarGlass
                    Return CreateMediaToolbarGlassPalette(
                        topBase:=topBase,
                        midBase:=midBase,
                        bottomBase:=bottomBase,
                        accent:=accent,
                        line:=line,
                        surfaceStrengthLevel:=context.SurfaceStrengthLevel)

                Case MASSurfaceMaterialIds.MediaCommandRail
                    Return CreateMediaCommandRailPalette(
                        topBase:=topBase,
                        midBase:=midBase,
                        bottomBase:=bottomBase,
                        accent:=accent,
                        line:=line,
                        glow:=glow,
                        surfaceStrengthLevel:=context.SurfaceStrengthLevel)

                Case MASSurfaceMaterialIds.MediaChrome
                    Return CreateMediaGalleryChromePalette(
                        topBase:=topBase,
                        midBase:=midBase,
                        bottomBase:=bottomBase,
                        accent:=accent,
                        line:=line,
                        surfaceStrengthLevel:=context.SurfaceStrengthLevel)

                Case MASSurfaceMaterialIds.MediaFooterChrome
                    Return CreateMediaGalleryFooterChromePalette(
                        topBase:=topBase,
                        midBase:=midBase,
                        bottomBase:=bottomBase,
                        accent:=accent,
                        line:=line,
                        glow:=glow,
                        surfaceStrengthLevel:=context.SurfaceStrengthLevel)

                Case MASSurfaceMaterialIds.MediaStage
                    Return CreateMediaGalleryStagePalette(
                        topBase:=topBase,
                        midBase:=midBase,
                        bottomBase:=bottomBase,
                        accent:=accent,
                        line:=line,
                        surfaceStrengthLevel:=context.SurfaceStrengthLevel)

                Case MASSurfaceMaterialIds.MenuBarFlat
                    Dim menuBar As MASMenuBarPaletteTheme = Nothing
                    If TryResolveMenuBarPalette(context, menuBar) Then
                        Return New MASSurfaceMaterialPalette(
                            top:=menuBar.BarTop,
                            mid:=menuBar.BarMid,
                            bottom:=menuBar.BarBottom,
                            accent:=menuBar.ItemSelectedIndicator,
                            line:=menuBar.BarSeparator,
                            glow:=menuBar.FocusRing)
                    End If

                    Return New MASSurfaceMaterialPalette(
                        top:=MASSurfaceMaterialPaintUtils.Mix(topBase, accent, 0.035F, 255),
                        mid:=MASSurfaceMaterialPaintUtils.Mix(midBase, accent, 0.02F, 255),
                        bottom:=MASSurfaceMaterialPaintUtils.Mix(bottomBase, line, 0.02F, 255),
                        accent:=accent,
                        line:=MASSurfaceMaterialPaintUtils.WithAlpha(line, 76),
                        glow:=MASSurfaceMaterialPaintUtils.WithAlpha(glow, 90))

                Case Else
                    Return New MASSurfaceMaterialPalette(
                        top:=topBase,
                        mid:=midBase,
                        bottom:=bottomBase,
                        accent:=accent,
                        line:=MASSurfaceMaterialPaintUtils.WithAlpha(innerRim, 42),
                        glow:=MASSurfaceMaterialPaintUtils.WithAlpha(glow, 64))
            End Select
        End Function

        Private Shared Function TryResolveMenuBarPalette(context As MASSurfaceMaterialContext,
                                                     ByRef palette As MASMenuBarPaletteTheme) As Boolean
            palette = Nothing
            If context Is Nothing OrElse context.ThemeContext Is Nothing Then Return False

            Dim menuTheme As IMASMenuTheme = context.ThemeContext.MenuTheme
            If menuTheme Is Nothing Then Return False

            palette = menuTheme.MenuBar
            Return True
        End Function

        Private Shared Function CreateFallback(materialId As String,
                                               surfaceStrengthLevel As Integer) As MASSurfaceMaterialPalette

            Dim strength As Single =
                MASSurfaceMaterialPaintUtils.LevelFactor(
                    surfaceStrengthLevel,
                    0.0F,
                    1.0F)

            Select Case If(materialId, String.Empty).Trim().ToLowerInvariant()

                Case MASSurfaceMaterialIds.SoftMist
                    Return New MASSurfaceMaterialPalette(
                        top:=New SKColor(246, 251, 255, 242),
                        mid:=New SKColor(232, 241, 249, 239),
                        bottom:=New SKColor(218, 230, 241, 232),
                        accent:=New SKColor(86, 155, 226, 255),
                        line:=New SKColor(255, 255, 255, CByte(42 + CInt(strength * 28))),
                        glow:=New SKColor(255, 255, 255, CByte(60 + CInt(strength * 36))))

                Case MASSurfaceMaterialIds.FrostedGlass
                    Return New MASSurfaceMaterialPalette(
                        top:=New SKColor(252, 255, 255, 214),
                        mid:=New SKColor(220, 238, 248, 198),
                        bottom:=New SKColor(205, 224, 238, 188),
                        accent:=New SKColor(76, 170, 235, 255),
                        line:=New SKColor(255, 255, 255, CByte(75 + CInt(strength * 30))),
                        glow:=New SKColor(255, 255, 255, CByte(95 + CInt(strength * 34))))

                Case MASSurfaceMaterialIds.CrystalIce, MASSurfaceMaterialIds.CrystalIceNative
                    Return New MASSurfaceMaterialPalette(
                        top:=New SKColor(232, 248, 255, 226),
                        mid:=New SKColor(198, 230, 255, 206),
                        bottom:=New SKColor(166, 205, 239, 214),
                        accent:=New SKColor(80, 175, 255, 255),
                        line:=New SKColor(255, 255, 255, CByte(30 + CInt(strength * 24))),
                        glow:=New SKColor(180, 230, 255, CByte(72 + CInt(strength * 30))))

                Case MASSurfaceMaterialIds.WarmPaper, MASSurfaceMaterialIds.WarmPaperNative
                    Return New MASSurfaceMaterialPalette(
                        top:=New SKColor(255, 250, 238, 244),
                        mid:=New SKColor(248, 241, 224, 240),
                        bottom:=New SKColor(239, 226, 204, 238),
                        accent:=New SKColor(166, 116, 48, 255),
                        line:=New SKColor(140, 108, 64, 16),
                        glow:=New SKColor(255, 244, 220, CByte(38 + CInt(strength * 24))))

                Case MASSurfaceMaterialIds.GraphiteMetal
                    Return New MASSurfaceMaterialPalette(
                        top:=New SKColor(64, 72, 84, 246),
                        mid:=New SKColor(42, 48, 58, 246),
                        bottom:=New SKColor(24, 28, 36, 248),
                        accent:=New SKColor(118, 170, 230, 255),
                        line:=New SKColor(255, 255, 255, CByte(14 + CInt(strength * 12))),
                        glow:=New SKColor(118, 170, 230, CByte(24 + CInt(strength * 24))))

                Case MASSurfaceMaterialIds.MediaShell
                    Return CreateMediaGalleryShellPalette(
                        topBase:=New SKColor(239, 246, 255, 255),
                        midBase:=New SKColor(226, 236, 250, 255),
                        bottomBase:=New SKColor(210, 223, 240, 255),
                        accent:=New SKColor(94, 132, 226, 255),
                        line:=New SKColor(92, 106, 132, 255),
                        surfaceStrengthLevel:=surfaceStrengthLevel)

                Case MASSurfaceMaterialIds.MediaToolbarGlass
                    Return CreateMediaToolbarGlassPalette(
                        topBase:=New SKColor(248, 252, 255, 255),
                        midBase:=New SKColor(235, 244, 252, 255),
                        bottomBase:=New SKColor(224, 236, 248, 255),
                        accent:=New SKColor(94, 132, 226, 255),
                        line:=New SKColor(86, 102, 130, 255),
                        surfaceStrengthLevel:=surfaceStrengthLevel)

                Case MASSurfaceMaterialIds.MediaCommandRail
                    Return CreateMediaCommandRailPalette(
                        topBase:=New SKColor(235, 243, 252, 255),
                        midBase:=New SKColor(220, 232, 245, 255),
                        bottomBase:=New SKColor(203, 218, 235, 255),
                        accent:=New SKColor(94, 132, 226, 255),
                        line:=New SKColor(76, 92, 118, 255),
                        glow:=New SKColor(255, 255, 255, 255),
                        surfaceStrengthLevel:=surfaceStrengthLevel)

                Case MASSurfaceMaterialIds.MediaChrome
                    Return CreateMediaGalleryChromePalette(
                        topBase:=New SKColor(247, 250, 254, 255),
                        midBase:=New SKColor(234, 242, 250, 255),
                        bottomBase:=New SKColor(219, 231, 243, 255),
                        accent:=New SKColor(94, 132, 226, 255),
                        line:=New SKColor(86, 102, 130, 255),
                        surfaceStrengthLevel:=surfaceStrengthLevel)

                Case MASSurfaceMaterialIds.MediaFooterChrome
                    Return CreateMediaGalleryFooterChromePalette(
                        topBase:=New SKColor(226, 236, 246, 255),
                        midBase:=New SKColor(213, 225, 238, 255),
                        bottomBase:=New SKColor(200, 214, 229, 255),
                        accent:=New SKColor(94, 132, 226, 255),
                        line:=New SKColor(82, 96, 122, 255),
                        glow:=New SKColor(255, 255, 255, 255),
                        surfaceStrengthLevel:=surfaceStrengthLevel)

                Case MASSurfaceMaterialIds.MediaStage
                    Return CreateMediaGalleryStagePalette(
                        topBase:=New SKColor(222, 232, 246, 255),
                        midBase:=New SKColor(204, 217, 235, 255),
                        bottomBase:=New SKColor(186, 202, 224, 255),
                        accent:=New SKColor(94, 132, 226, 255),
                        line:=New SKColor(82, 96, 122, 255),
                        surfaceStrengthLevel:=surfaceStrengthLevel)

                Case MASSurfaceMaterialIds.MenuBarFlat
                    Return New MASSurfaceMaterialPalette(
                        top:=New SKColor(231, 239, 247, 255),
                        mid:=New SKColor(221, 232, 242, 255),
                        bottom:=New SKColor(211, 224, 236, 255),
                        accent:=New SKColor(63, 136, 197, 255),
                        line:=New SKColor(86, 155, 226, 76),
                        glow:=New SKColor(63, 136, 197, 90))

                Case Else
                    Return New MASSurfaceMaterialPalette(
                        top:=New SKColor(238, 244, 249, 245),
                        mid:=New SKColor(225, 234, 242, 244),
                        bottom:=New SKColor(211, 223, 234, 242),
                        accent:=New SKColor(86, 155, 226, 255),
                        line:=New SKColor(255, 255, 255, 32),
                        glow:=New SKColor(255, 255, 255, 70))

            End Select
        End Function

        Private Shared Function CreateMediaGalleryShellPalette(topBase As SKColor,
                                                                midBase As SKColor,
                                                                bottomBase As SKColor,
                                                                accent As SKColor,
                                                                line As SKColor,
                                                                surfaceStrengthLevel As Integer) As MASSurfaceMaterialPalette
            Dim strength As Single =
                MASSurfaceMaterialPaintUtils.LevelFactor(
                    surfaceStrengthLevel,
                    0.0F,
                    1.0F)

            Dim shellTop As SKColor = New SKColor(246, 249, 253, 255)
            Dim shellMid As SKColor = New SKColor(233, 239, 247, 255)
            Dim shellBottom As SKColor = New SKColor(220, 229, 239, 255)

            Return New MASSurfaceMaterialPalette(
                top:=MASSurfaceMaterialPaintUtils.Mix(MASSurfaceMaterialPaintUtils.Mix(topBase, shellTop, 0.70F, 255), accent, 0.016F + strength * 0.008F, 255),
                mid:=MASSurfaceMaterialPaintUtils.Mix(MASSurfaceMaterialPaintUtils.Mix(midBase, shellMid, 0.64F, 255), accent, 0.020F + strength * 0.010F, 255),
                bottom:=MASSurfaceMaterialPaintUtils.Mix(MASSurfaceMaterialPaintUtils.Mix(bottomBase, shellBottom, 0.62F, 255), accent, 0.024F + strength * 0.012F, 255),
                accent:=accent,
                line:=MASSurfaceMaterialPaintUtils.WithAlpha(MASSurfaceMaterialPaintUtils.Mix(line, New SKColor(82, 98, 124, 255), 0.60F, 255), CByte(84 + CInt(strength * 22))),
                glow:=MASSurfaceMaterialPaintUtils.WithAlpha(MASSurfaceMaterialPaintUtils.Mix(SKColors.White, accent, 0.045F, 255), CByte(78 + CInt(strength * 20))))
        End Function

        Private Shared Function CreateMediaToolbarGlassPalette(topBase As SKColor,
                                                                 midBase As SKColor,
                                                                 bottomBase As SKColor,
                                                                 accent As SKColor,
                                                                 line As SKColor,
                                                                 surfaceStrengthLevel As Integer) As MASSurfaceMaterialPalette
            Dim strength As Single =
                MASSurfaceMaterialPaintUtils.LevelFactor(
                    surfaceStrengthLevel,
                    0.0F,
                    1.0F)

            Dim glassAlpha As Byte = 236
            Dim glassTop As SKColor = New SKColor(232, 240, 249, 255)
            Dim glassMid As SKColor = New SKColor(222, 233, 245, 255)
            Dim glassBottom As SKColor = New SKColor(213, 226, 240, 255)

            Return New MASSurfaceMaterialPalette(
                top:=MASSurfaceMaterialPaintUtils.Mix(MASSurfaceMaterialPaintUtils.Mix(topBase, glassTop, 0.58F, glassAlpha), accent, 0.012F + strength * 0.004F, glassAlpha),
                mid:=MASSurfaceMaterialPaintUtils.Mix(MASSurfaceMaterialPaintUtils.Mix(midBase, glassMid, 0.54F, glassAlpha), accent, 0.016F + strength * 0.006F, glassAlpha),
                bottom:=MASSurfaceMaterialPaintUtils.Mix(MASSurfaceMaterialPaintUtils.Mix(bottomBase, glassBottom, 0.52F, glassAlpha), accent, 0.018F + strength * 0.006F, glassAlpha),
                accent:=accent,
                line:=MASSurfaceMaterialPaintUtils.WithAlpha(MASSurfaceMaterialPaintUtils.Mix(line, New SKColor(76, 92, 118, 255), 0.58F, 255), CByte(34 + CInt(strength * 10))),
                glow:=MASSurfaceMaterialPaintUtils.WithAlpha(MASSurfaceMaterialPaintUtils.Mix(SKColors.White, accent, 0.035F, 255), CByte(28 + CInt(strength * 8))))
        End Function

        Private Shared Function CreateMediaCommandRailPalette(topBase As SKColor,
                                                                  midBase As SKColor,
                                                                  bottomBase As SKColor,
                                                                  accent As SKColor,
                                                                  line As SKColor,
                                                                  glow As SKColor,
                                                                  surfaceStrengthLevel As Integer) As MASSurfaceMaterialPalette
            Dim strength As Single =
                MASSurfaceMaterialPaintUtils.LevelFactor(
                    surfaceStrengthLevel,
                    0.0F,
                    1.0F)

            ' Transparent media glass:
            ' keep the material fully theme-driven, but let the shell show through enough so the
            ' rail reads as a lighter command glass rather than as another solid panel material.
            Dim topAlpha As Byte = CByte(186 + CInt(strength * 14))
            Dim midAlpha As Byte = CByte(170 + CInt(strength * 16))
            Dim bottomAlpha As Byte = CByte(180 + CInt(strength * 14))

            Dim topTone As SKColor =
                MASSurfaceMaterialPaintUtils.Mix(
                    MASSurfaceMaterialPaintUtils.Mix(topBase, glow, 0.34F + strength * 0.06F, topAlpha),
                    accent,
                    0.010F + strength * 0.006F,
                    topAlpha)

            Dim midTone As SKColor =
                MASSurfaceMaterialPaintUtils.Mix(
                    MASSurfaceMaterialPaintUtils.Mix(midBase, topBase, 0.26F + strength * 0.05F, midAlpha),
                    accent,
                    0.014F + strength * 0.008F,
                    midAlpha)

            Dim bottomTone As SKColor =
                MASSurfaceMaterialPaintUtils.Mix(
                    MASSurfaceMaterialPaintUtils.Mix(bottomBase, line, 0.035F + strength * 0.015F, bottomAlpha),
                    accent,
                    0.018F + strength * 0.010F,
                    bottomAlpha)

            Return New MASSurfaceMaterialPalette(
                top:=topTone,
                mid:=midTone,
                bottom:=bottomTone,
                accent:=MASSurfaceMaterialPaintUtils.WithAlpha(accent, CByte(34 + CInt(strength * 18))),
                line:=MASSurfaceMaterialPaintUtils.WithAlpha(MASSurfaceMaterialPaintUtils.Mix(line, accent, 0.10F + strength * 0.04F, 255), CByte(26 + CInt(strength * 12))),
                glow:=MASSurfaceMaterialPaintUtils.WithAlpha(MASSurfaceMaterialPaintUtils.Mix(glow, accent, 0.05F + strength * 0.03F, 255), CByte(46 + CInt(strength * 16))))
        End Function

        Private Shared Function CreateMediaGalleryChromePalette(topBase As SKColor,
                                                                 midBase As SKColor,
                                                                 bottomBase As SKColor,
                                                                 accent As SKColor,
                                                                 line As SKColor,
                                                                 surfaceStrengthLevel As Integer) As MASSurfaceMaterialPalette
            Dim strength As Single =
                MASSurfaceMaterialPaintUtils.LevelFactor(
                    surfaceStrengthLevel,
                    0.0F,
                    1.0F)

            Dim chromeTop As SKColor = New SKColor(251, 253, 255, 255)
            Dim chromeMid As SKColor = New SKColor(237, 244, 251, 255)
            Dim chromeBottom As SKColor = New SKColor(224, 234, 245, 255)

            Return New MASSurfaceMaterialPalette(
                top:=MASSurfaceMaterialPaintUtils.Mix(MASSurfaceMaterialPaintUtils.Mix(topBase, chromeTop, 0.78F, 255), accent, 0.016F + strength * 0.008F, 255),
                mid:=MASSurfaceMaterialPaintUtils.Mix(MASSurfaceMaterialPaintUtils.Mix(midBase, chromeMid, 0.70F, 255), accent, 0.024F + strength * 0.010F, 255),
                bottom:=MASSurfaceMaterialPaintUtils.Mix(MASSurfaceMaterialPaintUtils.Mix(bottomBase, chromeBottom, 0.66F, 255), accent, 0.030F + strength * 0.012F, 255),
                accent:=accent,
                line:=MASSurfaceMaterialPaintUtils.WithAlpha(MASSurfaceMaterialPaintUtils.Mix(line, New SKColor(88, 106, 132, 255), 0.56F, 255), CByte(82 + CInt(strength * 24))),
                glow:=MASSurfaceMaterialPaintUtils.WithAlpha(MASSurfaceMaterialPaintUtils.Mix(SKColors.White, accent, 0.075F, 255), CByte(104 + CInt(strength * 24))))
        End Function

        Private Shared Function CreateMediaGalleryFooterChromePalette(topBase As SKColor,
                                                                      midBase As SKColor,
                                                                      bottomBase As SKColor,
                                                                      accent As SKColor,
                                                                      line As SKColor,
                                                                      glow As SKColor,
                                                                      surfaceStrengthLevel As Integer) As MASSurfaceMaterialPalette
            Dim strength As Single =
                MASSurfaceMaterialPaintUtils.LevelFactor(
                    surfaceStrengthLevel,
                    0.0F,
                    1.0F)

            ' Grounded satin footer chrome:
            ' keep a deeper media-rail identity than toolbar glass, but let the active theme
            ' visibly steer the body, seam, and lift.  The older palette over-weighted fixed
            ' cool greys, so theme changes were mathematically present but visually muted.
            Dim footerTop As SKColor = New SKColor(219, 229, 240, 255)
            Dim footerMid As SKColor = New SKColor(205, 218, 233, 255)
            Dim footerBottom As SKColor = New SKColor(190, 206, 224, 255)
            Dim railAnchor As SKColor =
                MASSurfaceMaterialPaintUtils.Mix(
                    line,
                    accent,
                    0.24F + strength * 0.08F,
                    255)

            Dim topTone As SKColor =
                MASSurfaceMaterialPaintUtils.Mix(
                    MASSurfaceMaterialPaintUtils.Mix(topBase, footerTop, 0.36F, 255),
                    accent,
                    0.055F + strength * 0.018F,
                    255)

            Dim midTone As SKColor =
                MASSurfaceMaterialPaintUtils.Mix(
                    MASSurfaceMaterialPaintUtils.Mix(midBase, footerMid, 0.40F, 255),
                    accent,
                    0.070F + strength * 0.022F,
                    255)

            Dim bottomTone As SKColor =
                MASSurfaceMaterialPaintUtils.Mix(
                    MASSurfaceMaterialPaintUtils.Mix(bottomBase, footerBottom, 0.46F, 255),
                    railAnchor,
                    0.120F + strength * 0.045F,
                    255)

            Return New MASSurfaceMaterialPalette(
                top:=topTone,
                mid:=midTone,
                bottom:=bottomTone,
                accent:=accent,
                line:=MASSurfaceMaterialPaintUtils.WithAlpha(MASSurfaceMaterialPaintUtils.Mix(line, accent, 0.24F + strength * 0.10F, 255), CByte(52 + CInt(strength * 18))),
                glow:=MASSurfaceMaterialPaintUtils.WithAlpha(MASSurfaceMaterialPaintUtils.Mix(glow, accent, 0.10F + strength * 0.05F, 255), CByte(34 + CInt(strength * 14))))
        End Function

        Private Shared Function CreateMediaGalleryStagePalette(topBase As SKColor,
                                                                midBase As SKColor,
                                                                bottomBase As SKColor,
                                                                accent As SKColor,
                                                                line As SKColor,
                                                                surfaceStrengthLevel As Integer) As MASSurfaceMaterialPalette
            Dim strength As Single =
                MASSurfaceMaterialPaintUtils.LevelFactor(
                    surfaceStrengthLevel,
                    0.0F,
                    1.0F)

            Dim stageTop As SKColor = New SKColor(220, 231, 244, 255)
            Dim stageMid As SKColor = New SKColor(206, 219, 235, 255)
            Dim stageBottom As SKColor = New SKColor(192, 207, 225, 255)

            Return New MASSurfaceMaterialPalette(
                top:=MASSurfaceMaterialPaintUtils.Mix(MASSurfaceMaterialPaintUtils.Mix(topBase, stageTop, 0.66F, 255), accent, 0.016F + strength * 0.008F, 255),
                mid:=MASSurfaceMaterialPaintUtils.Mix(MASSurfaceMaterialPaintUtils.Mix(midBase, stageMid, 0.68F, 255), accent, 0.022F + strength * 0.010F, 255),
                bottom:=MASSurfaceMaterialPaintUtils.Mix(MASSurfaceMaterialPaintUtils.Mix(bottomBase, stageBottom, 0.70F, 255), accent, 0.026F + strength * 0.012F, 255),
                accent:=accent,
                line:=MASSurfaceMaterialPaintUtils.WithAlpha(MASSurfaceMaterialPaintUtils.Mix(line, New SKColor(74, 88, 112, 255), 0.58F, 255), CByte(42 + CInt(strength * 14))),
                glow:=MASSurfaceMaterialPaintUtils.WithAlpha(MASSurfaceMaterialPaintUtils.Mix(SKColors.White, accent, 0.035F, 255), CByte(30 + CInt(strength * 10))))
        End Function

    End Class

End Namespace
