Option Strict On
Option Explicit On

Imports System
Imports System.Collections.Generic
Imports Nexamas.UI.Controls
Imports Nexamas.UI.Layout

Namespace Nexamas.UI.Composition

    ' <summary>
    ' Settings page recipe family for the MASPage public facade.
    ' </summary>
    Partial Friend NotInheritable Class MASPage

        ''' <summary>
        ''' Creates a neutral settings page template from settings sections.
        ''' SettingsPage is a value template above Page/Form primitives; it does not render, validate, bind data,
        ''' navigate, open overlays, own input routing, own scroll runtime, own Theme state, or own Host lifecycle.
        ''' </summary>
        Public Shared Function SettingsPage(sections As IEnumerable(Of MASSettingsSection),
                                            Optional title As MASControlBase = Nothing,
                                            Optional description As MASControlBase = Nothing,
                                            Optional actions As IMASLayoutNode = Nothing,
                                            Optional spacing As Single = MASCompositionPageSizeTokens.SettingsPageSpacing,
                                            Optional padding As MASLayoutThickness = Nothing,
                                            Optional titleHeight As MASSizePolicy = Nothing,
                                            Optional descriptionHeight As MASSizePolicy = Nothing,
                                            Optional actionsWidth As MASSizePolicy = Nothing,
                                            Optional actionsHeight As MASSizePolicy = Nothing,
                                            Optional maxContentWidth As Single = MASCompositionPageSizeTokens.SettingsDetailsMaxContentWidth,
                                            Optional scrollEnabled As Boolean = True,
                                            Optional scrollKey As String = "",
                                            Optional useDefaultVisualPolish As Boolean = True) As IMASLayoutNode

            Return BuildSectionTemplatePage(Of MASSettingsSection)(
                sections:=sections,
                sectionToItem:=Function(section As MASSettingsSection) section.ToLayoutItem(),
                title:=title,
                description:=description,
                actions:=actions,
                spacing:=spacing,
                padding:=padding,
                titleHeight:=titleHeight,
                descriptionHeight:=descriptionHeight,
                actionsWidth:=actionsWidth,
                actionsHeight:=actionsHeight,
                maxContentWidth:=maxContentWidth,
                scrollEnabled:=scrollEnabled,
                scrollKey:=scrollKey,
                useDefaultVisualPolish:=useDefaultVisualPolish,
                paddingResolver:=AddressOf ResolveSettingsPagePadding)
        End Function

        ''' <summary>
        ''' Creates a neutral settings section from existing controls.
        ''' </summary>
        Public Shared Function SettingsSection(title As MASControlBase,
                                               rows As IEnumerable(Of MASSettingsRow),
                                               Optional description As MASControlBase = Nothing,
                                               Optional spacing As Single = MASCompositionPageSizeTokens.SettingsDetailsSectionSpacing,
                                               Optional padding As MASLayoutThickness = Nothing,
                                               Optional margin As MASLayoutThickness = Nothing,
                                               Optional key As String = "",
                                               Optional useDefaultVisualPolish As Boolean = True) As MASSettingsSection

            Return New MASSettingsSection(
                title:=title,
                rows:=rows,
                description:=description,
                spacing:=spacing,
                padding:=padding,
                margin:=margin,
                key:=key,
                useDefaultVisualPolish:=useDefaultVisualPolish)
        End Function

        ''' <summary>
        ''' Creates a neutral settings section from title/description text.
        ''' Generated labels are normal MASLabel controls, so rendering remains inside Core controls.
        ''' </summary>
        Public Shared Function SettingsSection(titleText As String,
                                               rows As IEnumerable(Of MASSettingsRow),
                                               Optional descriptionText As String = "",
                                               Optional spacing As Single = MASCompositionPageSizeTokens.SettingsDetailsSectionSpacing,
                                               Optional padding As MASLayoutThickness = Nothing,
                                               Optional margin As MASLayoutThickness = Nothing,
                                               Optional key As String = "",
                                               Optional useDefaultVisualPolish As Boolean = True) As MASSettingsSection

            Dim titleControl As MASLabel = Nothing
            Dim descriptionControl As MASLabel = Nothing

            If Not String.IsNullOrWhiteSpace(titleText) Then
                titleControl = MASPageLabelRecipeFactory.CreateSettingsTitle(titleText)
            End If

            If Not String.IsNullOrWhiteSpace(descriptionText) Then
                descriptionControl = MASPageLabelRecipeFactory.CreateSettingsDescription(descriptionText)
            End If

            Return SettingsSection(
                title:=titleControl,
                rows:=rows,
                description:=descriptionControl,
                spacing:=spacing,
                padding:=padding,
                margin:=margin,
                key:=key,
                useDefaultVisualPolish:=useDefaultVisualPolish)
        End Function

        ''' <summary>
        ''' Creates a neutral setting row from existing controls.
        ''' </summary>
        Public Shared Function SettingRow(label As MASControlBase,
                                          editor As MASControlBase,
                                          Optional description As MASControlBase = Nothing,
                                          Optional labelColumnWidth As MASSizePolicy = Nothing,
                                          Optional editorWidth As MASSizePolicy = Nothing,
                                          Optional editorHeight As MASSizePolicy = Nothing,
                                          Optional rowHeight As MASSizePolicy = Nothing,
                                          Optional spacing As Single = MASCompositionPageSizeTokens.SettingsRowSpacing,
                                          Optional padding As MASLayoutThickness = Nothing,
                                          Optional margin As MASLayoutThickness = Nothing,
                                          Optional key As String = "",
                                          Optional useDefaultVisualPolish As Boolean = True) As MASSettingsRow

            Return New MASSettingsRow(
                label:=label,
                editor:=editor,
                description:=description,
                labelColumnWidth:=labelColumnWidth,
                editorWidth:=editorWidth,
                editorHeight:=editorHeight,
                rowHeight:=rowHeight,
                spacing:=spacing,
                padding:=padding,
                margin:=margin,
                key:=key,
                useDefaultVisualPolish:=useDefaultVisualPolish)
        End Function

        ''' <summary>
        ''' Creates a neutral setting row from label/description text.
        ''' Prefer the MASControlBase overload when controls must be reused across rebuilds.
        ''' </summary>
        Public Shared Function SettingRow(labelText As String,
                                          editor As MASControlBase,
                                          Optional descriptionText As String = "",
                                          Optional labelColumnWidth As MASSizePolicy = Nothing,
                                          Optional editorWidth As MASSizePolicy = Nothing,
                                          Optional editorHeight As MASSizePolicy = Nothing,
                                          Optional rowHeight As MASSizePolicy = Nothing,
                                          Optional spacing As Single = MASCompositionPageSizeTokens.SettingsRowSpacing,
                                          Optional padding As MASLayoutThickness = Nothing,
                                          Optional margin As MASLayoutThickness = Nothing,
                                          Optional key As String = "",
                                          Optional useDefaultVisualPolish As Boolean = True) As MASSettingsRow

            Dim labelControl As MASLabel = MASPageLabelRecipeFactory.CreateSettingsRowLabel(labelText)
            Dim descriptionControl As MASLabel = Nothing

            If Not String.IsNullOrWhiteSpace(descriptionText) Then
                descriptionControl = MASPageLabelRecipeFactory.CreateSettingsRowDescription(descriptionText)
            End If

            Return SettingRow(
                label:=labelControl,
                editor:=editor,
                description:=descriptionControl,
                labelColumnWidth:=labelColumnWidth,
                editorWidth:=editorWidth,
                editorHeight:=editorHeight,
                rowHeight:=rowHeight,
                spacing:=spacing,
                padding:=padding,
                margin:=margin,
                key:=key,
                useDefaultVisualPolish:=useDefaultVisualPolish)
        End Function

    End Class

End Namespace
