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>
    ' Details page recipe family for the MASPage public facade.
    ' </summary>
    Partial Friend NotInheritable Class MASPage

        ''' <summary>
        ''' Creates a neutral read-oriented details page template from details sections.
        ''' DetailsPage is a value template above layout 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 DetailsPage(sections As IEnumerable(Of MASDetailsSection),
                                           Optional title As MASControlBase = Nothing,
                                           Optional description As MASControlBase = Nothing,
                                           Optional actions As IMASLayoutNode = Nothing,
                                           Optional spacing As Single = MASCompositionPageSizeTokens.DetailsPageSpacing,
                                           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 MASDetailsSection)(
                sections:=sections,
                sectionToItem:=Function(section As MASDetailsSection) 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 ResolveDetailsPagePadding)
        End Function

        ''' <summary>
        ''' Creates a neutral details section from existing controls.
        ''' </summary>
        Public Shared Function DetailsSection(title As MASControlBase,
                                              rows As IEnumerable(Of MASDetailsRow),
                                              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 MASDetailsSection

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

        ''' <summary>
        ''' Creates a neutral details section from title/description text.
        ''' Generated labels are normal MASLabel controls, so rendering remains inside Core controls.
        ''' </summary>
        Public Shared Function DetailsSection(titleText As String,
                                              rows As IEnumerable(Of MASDetailsRow),
                                              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 MASDetailsSection

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

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

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

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

        ''' <summary>
        ''' Creates a neutral details row from existing controls.
        ''' </summary>
        Public Shared Function DetailsRow(label As MASControlBase,
                                          valueControl As MASControlBase,
                                          Optional description As MASControlBase = Nothing,
                                          Optional labelColumnWidth As MASSizePolicy = Nothing,
                                          Optional valueWidth As MASSizePolicy = Nothing,
                                          Optional valueHeight As MASSizePolicy = Nothing,
                                          Optional rowHeight As MASSizePolicy = Nothing,
                                          Optional spacing As Single = MASCompositionPageSizeTokens.DetailsRowSpacing,
                                          Optional padding As MASLayoutThickness = Nothing,
                                          Optional margin As MASLayoutThickness = Nothing,
                                          Optional key As String = "",
                                          Optional useDefaultVisualPolish As Boolean = True) As MASDetailsRow

            Return New MASDetailsRow(
                label:=label,
                valueControl:=valueControl,
                description:=description,
                labelColumnWidth:=labelColumnWidth,
                valueWidth:=valueWidth,
                valueHeight:=valueHeight,
                rowHeight:=rowHeight,
                spacing:=spacing,
                padding:=padding,
                margin:=margin,
                key:=key,
                useDefaultVisualPolish:=useDefaultVisualPolish)
        End Function

        ''' <summary>
        ''' Creates a neutral details row from label/value/description text.
        ''' Prefer the MASControlBase overload when controls must be reused across rebuilds.
        ''' </summary>
        Public Shared Function DetailsRow(labelText As String,
                                          valueText As String,
                                          Optional descriptionText As String = "",
                                          Optional labelColumnWidth As MASSizePolicy = Nothing,
                                          Optional valueWidth As MASSizePolicy = Nothing,
                                          Optional valueHeight As MASSizePolicy = Nothing,
                                          Optional rowHeight As MASSizePolicy = Nothing,
                                          Optional spacing As Single = MASCompositionPageSizeTokens.DetailsRowSpacing,
                                          Optional padding As MASLayoutThickness = Nothing,
                                          Optional margin As MASLayoutThickness = Nothing,
                                          Optional key As String = "",
                                          Optional useDefaultVisualPolish As Boolean = True) As MASDetailsRow

            Dim labelControl As MASLabel = MASPageLabelRecipeFactory.CreateDetailsRowLabel(labelText)
            Dim valueControl As MASLabel = MASPageLabelRecipeFactory.CreateDetailsValue(valueText)
            Dim descriptionControl As MASLabel = Nothing

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

            Return DetailsRow(
                label:=labelControl,
                valueControl:=valueControl,
                description:=descriptionControl,
                labelColumnWidth:=labelColumnWidth,
                valueWidth:=valueWidth,
                valueHeight:=valueHeight,
                rowHeight:=rowHeight,
                spacing:=spacing,
                padding:=padding,
                margin:=margin,
                key:=key,
                useDefaultVisualPolish:=useDefaultVisualPolish)
        End Function

    End Class

End Namespace
