Option Strict On
Option Explicit On

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

Namespace Nexamas.UI.Composition

    ''' <summary>
    ''' Friend-owned Phase 1 facade for creating layout descriptions after final public API lockdown.
    ''' This class is the low-level Nexamas UI-owned entry point: it creates items and nodes only.
    ''' It does not attach controls, mutate BoundsLogical, open overlays, own scroll runtime, or own Theme/Host state.
    ''' </summary>
    <Global.System.ComponentModel.EditorBrowsable(Global.System.ComponentModel.EditorBrowsableState.Advanced)>
    Friend NotInheritable Class MASComposition

        Private Sub New()
        End Sub

        ''' <summary>
        ''' Creates a layout item for a MAS MASControlBase instance.
        ''' </summary>
        Friend Shared Function Item(control As MASControlBase,
                                    Optional width As MASSizePolicy = Nothing,
                                    Optional height As MASSizePolicy = Nothing,
                                    Optional alignment As MASLayoutAlignment = MASLayoutAlignment.Stretch,
                                    Optional margin As MASLayoutThickness = Nothing,
                                    Optional key As String = "",
                                    Optional controlOwnership As MASLayoutControlOwnership = MASLayoutControlOwnership.Borrowed) As MASLayoutItem

            Return MASLayoutItem.FromControl(
                control:=control,
                width:=width,
                height:=height,
                alignment:=alignment,
                visibility:=MASLayoutVisibilityPolicy.HiddenDoesNotTakeSpace,
                margin:=margin,
                dock:=MASLayoutDock.Center,
                key:=key,
                controlOwnership:=controlOwnership
            )
        End Function

        ''' <summary>
        ''' Creates a layout item for a MAS-owned recipe control that Composition may dispose when removed.
        ''' Caller-supplied controls must use Item instead and remain borrowed/detach-only.
        ''' </summary>
        Friend Shared Function OwnedItem(control As MASControlBase,
                                         Optional width As MASSizePolicy = Nothing,
                                         Optional height As MASSizePolicy = Nothing,
                                         Optional alignment As MASLayoutAlignment = MASLayoutAlignment.Stretch,
                                         Optional margin As MASLayoutThickness = Nothing,
                                         Optional key As String = "") As MASLayoutItem

            Return Item(
                control:=control,
                width:=width,
                height:=height,
                alignment:=alignment,
                margin:=margin,
                key:=key,
                controlOwnership:=MASLayoutControlOwnership.OwnedByComposition)
        End Function

        ''' <summary>
        ''' Creates a dock layout item for a MAS MASControlBase instance.
        ''' </summary>
        Friend Shared Function DockItem(control As MASControlBase,
                                        dock As MASLayoutDock,
                                        Optional width As MASSizePolicy = Nothing,
                                        Optional height As MASSizePolicy = Nothing,
                                        Optional margin As MASLayoutThickness = Nothing,
                                        Optional key As String = "",
                                        Optional controlOwnership As MASLayoutControlOwnership = MASLayoutControlOwnership.Borrowed) As MASLayoutItem

            Return MASLayoutItem.FromControl(
                control:=control,
                width:=width,
                height:=height,
                alignment:=MASLayoutAlignment.Stretch,
                visibility:=MASLayoutVisibilityPolicy.HiddenDoesNotTakeSpace,
                margin:=margin,
                dock:=dock,
                key:=key,
                controlOwnership:=controlOwnership
            )
        End Function

        ''' <summary>
        ''' Creates a layout item for a nested layout node.
        ''' </summary>
        Friend Shared Function NodeItem(node As IMASLayoutNode,
                                        Optional width As MASSizePolicy = Nothing,
                                        Optional height As MASSizePolicy = Nothing,
                                        Optional alignment As MASLayoutAlignment = MASLayoutAlignment.Stretch,
                                        Optional margin As MASLayoutThickness = Nothing,
                                        Optional key As String = "") As MASLayoutItem

            Return MASLayoutItem.FromNode(
                node:=node,
                width:=width,
                height:=height,
                alignment:=alignment,
                visibility:=MASLayoutVisibilityPolicy.HiddenDoesNotTakeSpace,
                margin:=margin,
                dock:=MASLayoutDock.Center,
                key:=key
            )
        End Function

        ''' <summary>
        ''' Creates a dock layout item for a nested layout node.
        ''' </summary>
        Friend Shared Function DockNodeItem(node As IMASLayoutNode,
                                            dock As MASLayoutDock,
                                            Optional width As MASSizePolicy = Nothing,
                                            Optional height As MASSizePolicy = Nothing,
                                            Optional margin As MASLayoutThickness = Nothing,
                                            Optional key As String = "") As MASLayoutItem

            Return MASLayoutItem.FromNode(
                node:=node,
                width:=width,
                height:=height,
                alignment:=MASLayoutAlignment.Stretch,
                visibility:=MASLayoutVisibilityPolicy.HiddenDoesNotTakeSpace,
                margin:=margin,
                dock:=dock,
                key:=key
            )
        End Function

        ''' <summary>
        ''' Convenience policy shortcut for MASSizePolicy.Auto.
        ''' </summary>
        Friend Shared Function Auto() As MASSizePolicy
            Return MASSizePolicy.Auto()
        End Function

        ''' <summary>
        ''' Convenience policy shortcut for MASSizePolicy.Fill.
        ''' </summary>
        Friend Shared Function Fill(Optional weight As Single = 1.0F) As MASSizePolicy
            Return MASSizePolicy.Fill(weight)
        End Function

        ''' <summary>
        ''' Convenience policy shortcut for MASSizePolicy.Fixed.
        ''' </summary>
        Friend Shared Function Fixed(value As Single) As MASSizePolicy
            Return MASSizePolicy.Fixed(value)
        End Function

        ''' <summary>
        ''' Convenience policy shortcut for MASSizePolicy.Range.
        ''' </summary>
        Friend Shared Function Range(Optional min As Single = 0.0F,
                                     Optional max As Single = Single.PositiveInfinity) As MASSizePolicy
            Return MASSizePolicy.Range(min, max)
        End Function

        ''' <summary>
        ''' Creates a layout-only spacer node. It produces no placements and owns no controls.
        ''' </summary>
        Friend Shared Function Spacer(Optional preferredWidth As Single = 0.0F,
                                      Optional preferredHeight As Single = 0.0F) As IMASLayoutNode

            Return New MASSpacerLayoutNode(preferredWidth, preferredHeight)
        End Function

        ''' <summary>
        ''' Creates a vertical layout node from explicit layout items.
        ''' </summary>
        Friend Shared Function Vertical(children As IEnumerable(Of MASLayoutItem),
                                        Optional spacing As Single = 0.0F,
                                        Optional padding As MASLayoutThickness = Nothing,
                                        Optional alignment As MASLayoutAlignment = MASLayoutAlignment.Stretch) As IMASLayoutNode

            Return New MASVerticalLayoutNode(children, spacing, padding, alignment)
        End Function

        ''' <summary>
        ''' Creates a horizontal layout node from explicit layout items.
        ''' </summary>
        Friend Shared Function Horizontal(children As IEnumerable(Of MASLayoutItem),
                                          Optional spacing As Single = 0.0F,
                                          Optional padding As MASLayoutThickness = Nothing,
                                          Optional alignment As MASLayoutAlignment = MASLayoutAlignment.Stretch) As IMASLayoutNode

            Return New MASHorizontalLayoutNode(children, spacing, padding, alignment)
        End Function

        ''' <summary>
        ''' Creates a dock layout node from explicit dock items.
        ''' </summary>
        Friend Shared Function Dock(children As IEnumerable(Of MASLayoutItem),
                                    Optional padding As MASLayoutThickness = Nothing) As IMASLayoutNode

            Return New MASDockLayoutNode(children, padding)
        End Function

    End Class

End Namespace
