Option Strict On
Option Explicit On

Imports Nexamas.UI.Values

Namespace Nexamas.UI.Rendering

    Friend NotInheritable Class MASShadowHierarchyProfiles
        Private Sub New()
        End Sub

        Friend Enum ElevationTier
            None = 0
            Hairline = 1
            Compact = 2
            Raised = 3
            Floating = 4
            Overlay = 5
        End Enum

        Friend Structure LayeredProfile
            Friend SigmaA_Dip As Single
            Friend AlphaA As Integer
            Friend OffY_A_Dip As Single
            Friend SigmaB_Dip As Single
            Friend AlphaB As Integer
            Friend OffY_B_Dip As Single
            Friend PadMinPx As Integer
            Friend PadSigmaMul As Single
        End Structure

        Friend Structure OuterProfile
            Friend SigmaDip As Single
            Friend Alpha As Integer
            Friend OffsetYDip As Single
            Friend PadMinPx As Integer
            Friend PadSigmaMul As Single
        End Structure

        Friend Structure CardProfile
            Friend SigmaA_Dip As Single
            Friend AlphaA As Integer
            Friend OffY_A_Dip As Single
            Friend SigmaB_Dip As Single
            Friend AlphaB As Integer
            Friend OffY_B_Dip As Single
            Friend PadMinPx As Integer
            Friend PadSigmaMul As Single
        End Structure

        Friend Shared Function ResolveLayeredTier(fam As CommonEnums.SurfaceFamily) As ElevationTier
            Select Case fam
                Case CommonEnums.SurfaceFamily.ScrollBar,
                     CommonEnums.SurfaceFamily.CheckBox,
                     CommonEnums.SurfaceFamily.RadioButton,
                     CommonEnums.SurfaceFamily.ToggleSwitch,
                     CommonEnums.SurfaceFamily.Row,
                     CommonEnums.SurfaceFamily.ProgressBar,
                     CommonEnums.SurfaceFamily.ColorPickerSVBox,
                     CommonEnums.SurfaceFamily.ColorPickerHueBar,
                     CommonEnums.SurfaceFamily.ColorPickerSlot,
                     CommonEnums.SurfaceFamily.ColorPickerSwatch,
                     CommonEnums.SurfaceFamily.ColorPickerMarker

                    Return ElevationTier.Hairline

                Case CommonEnums.SurfaceFamily.Input,
                     CommonEnums.SurfaceFamily.ComboBox,
                     CommonEnums.SurfaceFamily.Chip,
                     CommonEnums.SurfaceFamily.TabItem,
                     CommonEnums.SurfaceFamily.ButtonMas,
                     CommonEnums.SurfaceFamily.ButtonTal,
                     CommonEnums.SurfaceFamily.SegmentedControl,
                     CommonEnums.SurfaceFamily.TabStrip,
                     CommonEnums.SurfaceFamily.Chart

                    Return ElevationTier.Compact

                Case CommonEnums.SurfaceFamily.Tile,
                     CommonEnums.SurfaceFamily.TileBox,
                     CommonEnums.SurfaceFamily.SelectorItem,
                     CommonEnums.SurfaceFamily.TopBar,
                     CommonEnums.SurfaceFamily.GroupBoxTitlePlate

                    Return ElevationTier.Raised

                Case CommonEnums.SurfaceFamily.ListSurface,
                     CommonEnums.SurfaceFamily.DataGrid,
                     CommonEnums.SurfaceFamily.ListBox,
                     CommonEnums.SurfaceFamily.Card,
                     CommonEnums.SurfaceFamily.Media,
                     CommonEnums.SurfaceFamily.GroupBox,
                     CommonEnums.SurfaceFamily.ColorPicker,
                     CommonEnums.SurfaceFamily.ColorPickerPreview,
                     CommonEnums.SurfaceFamily.PropertyGrid

                    Return ElevationTier.Floating

                Case CommonEnums.SurfaceFamily.Fenster,
                     CommonEnums.SurfaceFamily.DropDown,
                     CommonEnums.SurfaceFamily.DropDownMenu,
                     CommonEnums.SurfaceFamily.ContextMenu,
                     CommonEnums.SurfaceFamily.Menu,
                     CommonEnums.SurfaceFamily.PanelShell,
                     CommonEnums.SurfaceFamily.Toast,
                     CommonEnums.SurfaceFamily.Tooltip

                    Return ElevationTier.Overlay

                Case Else
                    Return ElevationTier.None
            End Select
        End Function

        Friend Shared Function ResolveOuterTier(fam As CommonEnums.SurfaceFamily) As ElevationTier
            Select Case fam
                Case CommonEnums.SurfaceFamily.ScrollBar,
                     CommonEnums.SurfaceFamily.CheckBox,
                     CommonEnums.SurfaceFamily.RadioButton,
                     CommonEnums.SurfaceFamily.ToggleSwitch,
                     CommonEnums.SurfaceFamily.Row,
                     CommonEnums.SurfaceFamily.ProgressBar,
                     CommonEnums.SurfaceFamily.ColorPickerSVBox,
                     CommonEnums.SurfaceFamily.ColorPickerHueBar,
                     CommonEnums.SurfaceFamily.ColorPickerSlot,
                     CommonEnums.SurfaceFamily.ColorPickerSwatch,
                     CommonEnums.SurfaceFamily.ColorPickerMarker

                    Return ElevationTier.Hairline

                Case CommonEnums.SurfaceFamily.Input,
                     CommonEnums.SurfaceFamily.ComboBox,
                     CommonEnums.SurfaceFamily.Chip,
                     CommonEnums.SurfaceFamily.TabItem,
                     CommonEnums.SurfaceFamily.ButtonMas,
                     CommonEnums.SurfaceFamily.ButtonTal,
                     CommonEnums.SurfaceFamily.SegmentedControl,
                     CommonEnums.SurfaceFamily.TabStrip,
                     CommonEnums.SurfaceFamily.Chart

                    Return ElevationTier.Compact

                Case CommonEnums.SurfaceFamily.Tile,
                     CommonEnums.SurfaceFamily.TileBox,
                     CommonEnums.SurfaceFamily.SelectorItem,
                     CommonEnums.SurfaceFamily.TopBar,
                     CommonEnums.SurfaceFamily.GroupBoxTitlePlate

                    Return ElevationTier.Raised

                Case CommonEnums.SurfaceFamily.ListSurface,
                     CommonEnums.SurfaceFamily.DataGrid,
                     CommonEnums.SurfaceFamily.ListBox,
                     CommonEnums.SurfaceFamily.Card,
                     CommonEnums.SurfaceFamily.Media,
                     CommonEnums.SurfaceFamily.GroupBox,
                     CommonEnums.SurfaceFamily.ColorPicker,
                     CommonEnums.SurfaceFamily.ColorPickerPreview,
                     CommonEnums.SurfaceFamily.PropertyGrid

                    Return ElevationTier.Floating

                Case CommonEnums.SurfaceFamily.Fenster,
                     CommonEnums.SurfaceFamily.DropDown,
                     CommonEnums.SurfaceFamily.DropDownMenu,
                     CommonEnums.SurfaceFamily.ContextMenu,
                     CommonEnums.SurfaceFamily.Menu,
                     CommonEnums.SurfaceFamily.PanelShell,
                     CommonEnums.SurfaceFamily.Toast,
                     CommonEnums.SurfaceFamily.Tooltip

                    Return ElevationTier.Overlay

                Case Else
                    Return ElevationTier.None
            End Select
        End Function

        Friend Shared Function ResolveLayeredProfile(tier As ElevationTier) As LayeredProfile
            Select Case tier
                Case ElevationTier.Hairline
                    Return New LayeredProfile With {
                        .SigmaA_Dip = 3.0F,
                        .AlphaA = 9,
                        .OffY_A_Dip = 0.2F,
                        .SigmaB_Dip = 1.0F,
                        .AlphaB = 7,
                        .OffY_B_Dip = 0.05F,
                        .PadMinPx = 8,
                        .PadSigmaMul = 2.95F
                    }

                Case ElevationTier.Compact
                    Return New LayeredProfile With {
                        .SigmaA_Dip = 6.4F,
                        .AlphaA = 15,
                        .OffY_A_Dip = 0.72F,
                        .SigmaB_Dip = 1.9F,
                        .AlphaB = 12,
                        .OffY_B_Dip = 0.14F,
                        .PadMinPx = 12,
                        .PadSigmaMul = 3.4F
                    }

                Case ElevationTier.Raised
                    Return New LayeredProfile With {
                        .SigmaA_Dip = 8.4F,
                        .AlphaA = 17,
                        .OffY_A_Dip = 1.02F,
                        .SigmaB_Dip = 2.4F,
                        .AlphaB = 15,
                        .OffY_B_Dip = 0.22F,
                        .PadMinPx = 14,
                        .PadSigmaMul = 3.6F
                    }

                Case ElevationTier.Floating
                    Return New LayeredProfile With {
                        .SigmaA_Dip = 10.4F,
                        .AlphaA = 30,
                        .OffY_A_Dip = 1.48F,
                        .SigmaB_Dip = 3.1F,
                        .AlphaB = 18,
                        .OffY_B_Dip = 0.32F,
                        .PadMinPx = 18,
                        .PadSigmaMul = 3.95F
                    }

                Case ElevationTier.Overlay
                    Return New LayeredProfile With {
                        .SigmaA_Dip = 12.2F,
                        .AlphaA = 24,
                        .OffY_A_Dip = 1.92F,
                        .SigmaB_Dip = 3.7F,
                        .AlphaB = 21,
                        .OffY_B_Dip = 0.42F,
                        .PadMinPx = 22,
                        .PadSigmaMul = 4.2F
                    }

                Case Else
                    Return EmptyLayeredProfile()
            End Select
        End Function

        Friend Shared Function ResolveOuterProfile(tier As ElevationTier) As OuterProfile
            Select Case tier
                Case ElevationTier.Hairline
                    Return New OuterProfile With {
                        .SigmaDip = 2.1F,
                        .Alpha = 7,
                        .OffsetYDip = 0.08F,
                        .PadMinPx = 8,
                        .PadSigmaMul = 2.85F
                    }

                Case ElevationTier.Compact
                    Return New OuterProfile With {
                        .SigmaDip = 3.8F,
                        .Alpha = 11,
                        .OffsetYDip = 0.26F,
                        .PadMinPx = 10,
                        .PadSigmaMul = 3.15F
                    }

                Case ElevationTier.Raised
                    Return New OuterProfile With {
                        .SigmaDip = 5.1F,
                        .Alpha = 13,
                        .OffsetYDip = 0.46F,
                        .PadMinPx = 14,
                        .PadSigmaMul = 3.35F
                    }

                Case ElevationTier.Floating
                    Return New OuterProfile With {
                        .SigmaDip = 6.9F,
                        .Alpha = 17,
                        .OffsetYDip = 0.84F,
                        .PadMinPx = 18,
                        .PadSigmaMul = 3.6F
                    }

                Case ElevationTier.Overlay
                    Return New OuterProfile With {
                        .SigmaDip = 8.8F,
                        .Alpha = 22,
                        .OffsetYDip = 1.28F,
                        .PadMinPx = 22,
                        .PadSigmaMul = 3.9F
                    }

                Case Else
                    Return EmptyOuterProfile()
            End Select
        End Function

        Friend Shared Function ResolveCardProfile(Optional secondary As Boolean = False) As CardProfile
            If secondary Then
                Return New CardProfile With {
                    .SigmaA_Dip = 11.0F,
                    .AlphaA = 18,
                    .OffY_A_Dip = 1.18F,
                    .SigmaB_Dip = 3.0F,
                    .AlphaB = 15,
                    .OffY_B_Dip = 0.24F,
                    .PadMinPx = 16,
                    .PadSigmaMul = 4.0F
                }
            End If

            Return New CardProfile With {
                .SigmaA_Dip = 12.8F,
                .AlphaA = 21,
                .OffY_A_Dip = 1.42F,
                .SigmaB_Dip = 3.45F,
                .AlphaB = 17,
                .OffY_B_Dip = 0.3F,
                .PadMinPx = 18,
                .PadSigmaMul = 4.15F
            }
        End Function

        Private Shared Function EmptyLayeredProfile() As LayeredProfile
            Return New LayeredProfile With {
                .SigmaA_Dip = 0.0F,
                .AlphaA = 0,
                .OffY_A_Dip = 0.0F,
                .SigmaB_Dip = 0.0F,
                .AlphaB = 0,
                .OffY_B_Dip = 0.0F,
                .PadMinPx = 10,
                .PadSigmaMul = 3.0F
            }
        End Function

        Private Shared Function EmptyOuterProfile() As OuterProfile
            Return New OuterProfile With {
                .SigmaDip = 0.0F,
                .Alpha = 0,
                .OffsetYDip = 0.0F,
                .PadMinPx = 10,
                .PadSigmaMul = 3.0F
            }
        End Function

    End Class

End Namespace