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>
    ''' Friend-owned page-template facade after final public API lockdown.
    ''' A Page is a reusable content region. It primarily creates layout descriptions. Convenience text
    ''' recipes may create small MASLabel controls through MASPageLabelRecipeFactory, but MASPage still
    ''' does not own host lifecycle, ControlsLayer, rendering, overlay, scroll runtime, input routing,
    ''' DPI pipeline, or Theme state.
    ''' </summary>
    <Global.System.ComponentModel.EditorBrowsable(Global.System.ComponentModel.EditorBrowsableState.Advanced)>
    Partial Friend NotInheritable Class MASPage

        Private Const DEFAULT_PAGE_SPACING As Single = MASCompositionPageSizeTokens.PageSpacing
        Private Const DEFAULT_FORM_SPACING As Single = MASCompositionPageSizeTokens.FormSpacing
        Private Const DEFAULT_FORM_SECTION_SPACING As Single = MASCompositionPageSizeTokens.FormSectionSpacing
        Private Const DEFAULT_FORM_FIELD_SPACING As Single = MASCompositionPageSizeTokens.FormFieldSpacing
        Private Const DEFAULT_FORM_ACTIONS_SPACING As Single = MASCompositionPageSizeTokens.FormActionsSpacing
        Private Const DEFAULT_HEADER_HEIGHT As Single = MASCompositionPageSizeTokens.HeaderHeight
        Private Const DEFAULT_DESCRIPTION_HEIGHT As Single = MASCompositionPageSizeTokens.DescriptionHeight
        Private Const DEFAULT_ACTIONS_HEIGHT As Single = MASCompositionPageSizeTokens.ActionsHeight
        Private Const DEFAULT_ACTIONS_WIDTH As Single = MASCompositionPageSizeTokens.ActionsWidth
        Private Const DEFAULT_FIELD_HEIGHT As Single = MASCompositionPageSizeTokens.FieldHeight

        Private Sub New()
        End Sub

        ''' <summary>
        ''' Advanced/precise vertical page entry point when each child already has its own MASLayoutItem policy.
        ''' </summary>
        Public Shared Function Vertical(children As IEnumerable(Of MASLayoutItem),
                                        Optional spacing As Single = DEFAULT_PAGE_SPACING,
                                        Optional padding As MASLayoutThickness = Nothing,
                                        Optional alignment As MASLayoutAlignment = MASLayoutAlignment.Stretch,
                                        Optional maxContentWidth As Single = MASCompositionPageSizeTokens.PageMaxContentWidth) As IMASLayoutNode

            Dim inner As IMASLayoutNode =
                MASComposition.Vertical(
                    children:=children,
                    spacing:=spacing,
                    padding:=padding,
                    alignment:=alignment
                )

            Return WrapMaxContentWidth(inner, maxContentWidth)
        End Function

        ''' <summary>
        ''' Creates a common vertical page: title, description, fill content, and actions area.
        ''' Phase 2 uses Auto for natural header/action regions; content remains Fill by default.
        ''' </summary>
        Public Shared Function Vertical(Optional title As MASControlBase = Nothing,
                                        Optional description As MASControlBase = Nothing,
                                        Optional content As MASControlBase = Nothing,
                                        Optional actions As MASControlBase = Nothing,
                                        Optional spacing As Single = DEFAULT_PAGE_SPACING,
                                        Optional padding As MASLayoutThickness = Nothing,
                                        Optional alignment As MASLayoutAlignment = MASLayoutAlignment.Stretch,
                                        Optional titleHeight As MASSizePolicy = Nothing,
                                        Optional descriptionHeight As MASSizePolicy = Nothing,
                                        Optional contentHeight As MASSizePolicy = Nothing,
                                        Optional actionsWidth As MASSizePolicy = Nothing,
                                        Optional actionsHeight As MASSizePolicy = Nothing,
                                        Optional maxContentWidth As Single = MASCompositionPageSizeTokens.PageMaxContentWidth) As IMASLayoutNode

            Dim items As New List(Of MASLayoutItem)()

            If title IsNot Nothing Then
                items.Add(
                    MASComposition.Item(
                        control:=title,
                        height:=If(titleHeight, MASSizePolicy.Auto())
                    )
                )
            End If

            If description IsNot Nothing Then
                items.Add(
                    MASComposition.Item(
                        control:=description,
                        height:=If(descriptionHeight, MASSizePolicy.Auto())
                    )
                )
            End If

            If content IsNot Nothing Then
                items.Add(
                    MASComposition.Item(
                        control:=content,
                        height:=If(contentHeight, MASSizePolicy.Fill(1.0F))
                    )
                )
            End If

            If actions IsNot Nothing Then
                items.Add(
                    MASComposition.Item(
                        control:=actions,
                        width:=If(actionsWidth, MASSizePolicy.Auto()),
                        height:=If(actionsHeight, MASSizePolicy.Auto()),
                        alignment:=MASLayoutAlignment.End
                    )
                )
            End If

            Return Vertical(
                children:=items.ToArray(),
                spacing:=spacing,
                padding:=padding,
                alignment:=alignment,
                maxContentWidth:=maxContentWidth
            )
        End Function

        ''' <summary>
        ''' Same as Vertical, but accepts nested layout nodes for content/actions-heavy pages.
        ''' Use this when a region is itself composed from multiple controls.
        ''' </summary>
        Public Shared Function VerticalNodes(Optional title As IMASLayoutNode = Nothing,
                                             Optional description As IMASLayoutNode = Nothing,
                                             Optional content As IMASLayoutNode = Nothing,
                                             Optional actions As IMASLayoutNode = Nothing,
                                             Optional spacing As Single = DEFAULT_PAGE_SPACING,
                                             Optional padding As MASLayoutThickness = Nothing,
                                             Optional alignment As MASLayoutAlignment = MASLayoutAlignment.Stretch,
                                             Optional titleHeight As MASSizePolicy = Nothing,
                                             Optional descriptionHeight As MASSizePolicy = Nothing,
                                             Optional contentHeight As MASSizePolicy = Nothing,
                                             Optional actionsWidth As MASSizePolicy = Nothing,
                                             Optional actionsHeight As MASSizePolicy = Nothing,
                                             Optional maxContentWidth As Single = MASCompositionPageSizeTokens.PageMaxContentWidth) As IMASLayoutNode

            Dim items As New List(Of MASLayoutItem)()

            If title IsNot Nothing Then
                items.Add(
                    MASComposition.NodeItem(
                        node:=title,
                        height:=If(titleHeight, MASSizePolicy.Auto())
                    )
                )
            End If

            If description IsNot Nothing Then
                items.Add(
                    MASComposition.NodeItem(
                        node:=description,
                        height:=If(descriptionHeight, MASSizePolicy.Auto())
                    )
                )
            End If

            If content IsNot Nothing Then
                items.Add(
                    MASComposition.NodeItem(
                        node:=content,
                        height:=If(contentHeight, MASSizePolicy.Fill(1.0F))
                    )
                )
            End If

            If actions IsNot Nothing Then
                items.Add(
                    MASComposition.NodeItem(
                        node:=actions,
                        width:=If(actionsWidth, MASSizePolicy.Auto()),
                        height:=If(actionsHeight, MASSizePolicy.Auto()),
                        alignment:=MASLayoutAlignment.End
                    )
                )
            End If

            Return Vertical(
                children:=items.ToArray(),
                spacing:=spacing,
                padding:=padding,
                alignment:=alignment,
                maxContentWidth:=maxContentWidth
            )
        End Function


    End Class

End Namespace
