Option Strict On
Option Explicit On

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

Namespace Nexamas.UI.Composition

    ''' <summary>
    ''' Host-scoped Screen facade.
    ''' It creates MASScreen recipes and can apply them through the owning MASCompositionHostRuntime.
    ''' </summary>
    <Global.System.ComponentModel.EditorBrowsable(Global.System.ComponentModel.EditorBrowsableState.Advanced)>
    Friend NotInheritable Class MASHostScreenFacade

        Private ReadOnly _runtime As MASCompositionHostRuntime

        Friend Sub New(runtime As MASCompositionHostRuntime)
            If runtime Is Nothing Then Throw New ArgumentNullException(NameOf(runtime))
            _runtime = runtime
        End Sub

        Friend Function Dock(Optional top As MASControlBase = Nothing,
                             Optional bottom As MASControlBase = Nothing,
                             Optional left As MASControlBase = Nothing,
                             Optional right As MASControlBase = Nothing,
                             Optional content As MASControlBase = Nothing,
                             Optional topHeight As MASSizePolicy = Nothing,
                             Optional bottomHeight As MASSizePolicy = Nothing,
                             Optional leftWidth As MASSizePolicy = Nothing,
                             Optional rightWidth As MASSizePolicy = Nothing,
                             Optional padding As MASLayoutThickness = Nothing) As IMASLayoutNode

            Return MASScreen.Dock(top, bottom, left, right, content, topHeight, bottomHeight, leftWidth, rightWidth, padding)
        End Function

        Friend Function DockItems(children As IEnumerable(Of MASLayoutItem),
                                  Optional padding As MASLayoutThickness = Nothing) As IMASLayoutNode

            Return MASScreen.Dock(children, padding)
        End Function

        ''' <summary>
        ''' Host-scoped dock recipe for screen regions that are already layout nodes.
        ''' This is the Application-window gateway equivalent of MASScreen.DockNodes and keeps external consumers
        ''' on window.Screen instead of calling the static screen recipe directly.
        ''' </summary>
        Friend Function DockNodes(Optional top As IMASLayoutNode = Nothing,
                                  Optional bottom As IMASLayoutNode = Nothing,
                                  Optional left As IMASLayoutNode = Nothing,
                                  Optional right As IMASLayoutNode = Nothing,
                                  Optional content As IMASLayoutNode = Nothing,
                                  Optional topHeight As MASSizePolicy = Nothing,
                                  Optional bottomHeight As MASSizePolicy = Nothing,
                                  Optional leftWidth As MASSizePolicy = Nothing,
                                  Optional rightWidth As MASSizePolicy = Nothing,
                                  Optional padding As MASLayoutThickness = Nothing) As IMASLayoutNode

            Return MASScreen.DockNodes(top, bottom, left, right, content, topHeight, bottomHeight, leftWidth, rightWidth, padding)
        End Function

        Friend Function AppShell(Optional topBar As MASControlBase = Nothing,
                                 Optional sidebar As MASControlBase = Nothing,
                                 Optional content As MASControlBase = Nothing,
                                 Optional topBarHeight As MASSizePolicy = Nothing,
                                 Optional sidebarWidth As MASSizePolicy = Nothing,
                                 Optional padding As MASLayoutThickness = Nothing) As IMASLayoutNode

            Return MASScreen.AppShell(topBar, sidebar, content, topBarHeight, sidebarWidth, padding)
        End Function

        Friend Function ContentShell(Optional top As MASControlBase = Nothing,
                                     Optional content As MASControlBase = Nothing,
                                     Optional bottom As MASControlBase = Nothing,
                                     Optional topHeight As MASSizePolicy = Nothing,
                                     Optional bottomHeight As MASSizePolicy = Nothing,
                                     Optional padding As MASLayoutThickness = Nothing) As IMASLayoutNode

            Return MASScreen.ContentShell(top, content, bottom, topHeight, bottomHeight, padding)
        End Function

        Friend Function Show(screen As IMASLayoutNode) As Boolean
            Return _runtime.SetLayout(screen)
        End Function

        Friend Function ShowFactory(factory As Func(Of IMASLayoutNode),
                                    Optional applyImmediately As Boolean = True) As Boolean
            Return _runtime.SetLayoutFactory(factory, applyImmediately)
        End Function

    End Class

End Namespace
