Option Strict On
Option Explicit On

Imports System
Imports Nexamas.UI.Layout
Imports SkiaSharp

Namespace Nexamas.UI.Application

    ''' <summary>
    ''' Internal layout policy for Nexamas UI-owned PanelShell surfaces. High-level surfaces
    ''' such as SelectionPanel choose semantic presets here instead of scattering button widths,
    ''' gaps, frame padding, and preset bounds through request builders.
    ''' </summary>
    Friend NotInheritable Class MASApplicationPanelShellLayoutPolicy
        Private Sub New()
        End Sub

        Friend Shared Sub ConfigureSelectionPanelChrome(panelOptions As MASApplicationPanelShellOptions)
            If panelOptions Is Nothing Then Return

            panelOptions.Content.ScrollbarEdgeInsetPx = MASApplicationSurfaceSizeTokens.SelectionPanelScrollbarEdgeInsetDip

            Dim groupBox As MASApplicationPanelShellContentGroupBox = panelOptions.Content.UseScrollableGroupBox()
            groupBox.Surface = MASApplicationPanelShellContentGroupBox.SurfaceKind.TransparentFrame
            groupBox.SetPadding(horizontalPx:=MASApplicationSurfaceSizeTokens.SelectionPanelGroupBoxPaddingHorizontalDip, verticalPx:=MASApplicationSurfaceSizeTokens.SelectionPanelGroupBoxPaddingVerticalDip)
            groupBox.BorderStrength = MASApplicationPanelShellContentGroupBox.BorderStrengthKind.Level2
            groupBox.DrawShadow = False
            groupBox.DrawPremiumBorder = True
            groupBox.DrawSeparator = False
        End Sub

        Friend Shared Sub ConfigureSelectionPanelToolbar(panelOptions As MASApplicationPanelShellOptions,
                                                         hasToolbar As Boolean)
            If panelOptions Is Nothing Then Return

            panelOptions.Toolbar.Visible = hasToolbar
            panelOptions.Toolbar.Alignment = MASApplicationPanelShellAlignment.Start
            panelOptions.Toolbar.ConfigureActionMetrics(
                sectionHeightPx:=MASApplicationSurfaceSizeTokens.SelectionPanelToolbarSectionHeightDip,
                buttonWidthPx:=MASApplicationSurfaceSizeTokens.SelectionPanelToolbarButtonWidthDip,
                buttonHeightPx:=MASApplicationSurfaceSizeTokens.SelectionPanelToolbarButtonHeightDip,
                buttonGapPx:=MASApplicationSurfaceSizeTokens.SelectionPanelToolbarButtonGapDip,
                contentGapPx:=If(hasToolbar, MASApplicationSurfaceSizeTokens.SelectionPanelToolbarContentGapDip, 0.0F))
        End Sub

        Friend Shared Sub ConfigureSelectionPanelFooter(panelOptions As MASApplicationPanelShellOptions)
            If panelOptions Is Nothing Then Return

            panelOptions.Footer.Visible = True
            panelOptions.Footer.Alignment = MASApplicationPanelShellAlignment.Start
            panelOptions.Footer.ConfigureActionMetrics(
                sectionHeightPx:=MASApplicationSurfaceSizeTokens.SelectionPanelFooterSectionHeightDip,
                buttonWidthPx:=MASApplicationSurfaceSizeTokens.SelectionPanelFooterButtonWidthDip,
                buttonHeightPx:=MASApplicationSurfaceSizeTokens.SelectionPanelFooterButtonHeightDip,
                buttonGapPx:=MASApplicationSurfaceSizeTokens.SelectionPanelFooterButtonGapDip,
                contentGapPx:=MASApplicationSurfaceSizeTokens.SelectionPanelFooterContentGapDip)
        End Sub

        Friend Shared Sub ApplySelectionPanelSizePreset(panelOptions As MASApplicationPanelShellOptions,
                                                        preset As MASSelectionPanelSizePreset)
            If panelOptions Is Nothing Then Return

            Select Case preset
                Case MASSelectionPanelSizePreset.Compact
                    panelOptions.ConfigureSurfaceSize(
                        minWidthPx:=MASApplicationSurfaceSizeTokens.SelectionPanelCompactMinWidthDip,
                        minHeightPx:=MASApplicationSurfaceSizeTokens.SelectionPanelCompactMinHeightDip,
                        maxWidthPx:=MASApplicationSurfaceSizeTokens.SelectionPanelCompactMaxWidthDip,
                        maxHeightPx:=MASApplicationSurfaceSizeTokens.SelectionPanelCompactMaxHeightDip,
                        widthRatio:=MASApplicationSurfaceSizeTokens.SelectionPanelCompactWidthRatio,
                        heightRatio:=MASApplicationSurfaceSizeTokens.SelectionPanelCompactHeightRatio)

                Case MASSelectionPanelSizePreset.Wide
                    panelOptions.ConfigureSurfaceSize(
                        minWidthPx:=MASApplicationSurfaceSizeTokens.SelectionPanelWideMinWidthDip,
                        minHeightPx:=MASApplicationSurfaceSizeTokens.SelectionPanelWideMinHeightDip,
                        maxWidthPx:=MASApplicationSurfaceSizeTokens.SelectionPanelWideMaxWidthDip,
                        maxHeightPx:=MASApplicationSurfaceSizeTokens.SelectionPanelWideMaxHeightDip,
                        widthRatio:=MASApplicationSurfaceSizeTokens.SelectionPanelWideWidthRatio,
                        heightRatio:=MASApplicationSurfaceSizeTokens.SelectionPanelWideHeightRatio)

                Case MASSelectionPanelSizePreset.Default
                    panelOptions.ConfigureSurfaceSize(
                        minWidthPx:=MASApplicationSurfaceSizeTokens.SelectionPanelDefaultMinWidthDip,
                        minHeightPx:=MASApplicationSurfaceSizeTokens.SelectionPanelDefaultMinHeightDip,
                        maxWidthPx:=MASApplicationSurfaceSizeTokens.SelectionPanelDefaultMaxWidthDip,
                        maxHeightPx:=MASApplicationSurfaceSizeTokens.SelectionPanelDefaultMaxHeightDip,
                        widthRatio:=MASApplicationSurfaceSizeTokens.SelectionPanelDefaultWidthRatio,
                        heightRatio:=MASApplicationSurfaceSizeTokens.SelectionPanelDefaultHeightRatio)

                Case Else
                    panelOptions.ConfigureSurfaceSize(
                        minWidthPx:=MASApplicationSurfaceSizeTokens.SelectionPanelFallbackMinWidthDip,
                        minHeightPx:=MASApplicationSurfaceSizeTokens.SelectionPanelFallbackMinHeightDip,
                        maxWidthPx:=MASApplicationSurfaceSizeTokens.SelectionPanelFallbackMaxWidthDip,
                        maxHeightPx:=MASApplicationSurfaceSizeTokens.SelectionPanelFallbackMaxHeightDip,
                        widthRatio:=MASApplicationSurfaceSizeTokens.SelectionPanelFallbackWidthRatio,
                        heightRatio:=MASApplicationSurfaceSizeTokens.SelectionPanelFallbackHeightRatio)
            End Select
        End Sub

        Friend Shared Function SelectionPanelDescriptionHeight(contentWidthPx As Single,
                                                               hasDescription As Boolean) As Single
            If Not hasDescription Then Return 0.0F
            Return If(contentWidthPx < MASApplicationSurfaceSizeTokens.SelectionPanelNarrowDescriptionWidthDip, MASApplicationSurfaceSizeTokens.SelectionPanelNarrowDescriptionHeightDip, MASApplicationSurfaceSizeTokens.SelectionPanelDefaultDescriptionHeightDip)
        End Function

        Friend Shared Function SelectionPanelCountRowHeight() As Single
            Return MASApplicationSurfaceSizeTokens.SelectionPanelCountRowHeightDip
        End Function

        Friend Shared Function SelectionPanelScrollTopGap() As Single
            Return MASApplicationSurfaceSizeTokens.SelectionPanelScrollTopGapDip
        End Function

        Friend Shared Function SelectionPanelColumnGap() As Single
            Return MASApplicationSurfaceSizeTokens.SelectionPanelColumnGapDip
        End Function

        Friend Shared Function SelectionPanelRowHeight() As Single
            Return MASApplicationSurfaceSizeTokens.SelectionPanelRowHeightDip
        End Function

        Friend Shared Function SelectionPanelRowGap() As Single
            Return MASApplicationSurfaceSizeTokens.SelectionPanelRowGapDip
        End Function

        Friend Shared Function SelectionPanelEstimatedScrollRailWidth() As Single
            Return MASApplicationSurfaceSizeTokens.SelectionPanelEstimatedScrollRailWidthDip
        End Function

        Friend Shared Function SelectionPanelContentLeftPad() As Single
            Return MASApplicationSurfaceSizeTokens.SelectionPanelContentLeftPadDip
        End Function

        Friend Shared Function SelectionPanelMinimumColumnWidth() As Single
            Return MASApplicationSurfaceSizeTokens.SelectionPanelMinimumColumnWidthDip
        End Function

        Friend Shared Function SelectionPanelDescriptionBottomGap() As Single
            Return MASApplicationSurfaceSizeTokens.SelectionPanelDescriptionBottomGapDip
        End Function

        Friend Shared Function SelectionPanelGridThresholdItemCount() As Integer
            Return MASApplicationSurfaceSizeTokens.SelectionPanelGridThresholdItemCount
        End Function

        Friend Shared Function SelectionPanelGridColumnCount() As Integer
            Return MASApplicationSurfaceSizeTokens.SelectionPanelGridColumnCount
        End Function

    End Class

End Namespace
