Option Strict On
Option Explicit On

Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports Nexamas.UI.Components
Imports Nexamas.UI.Controls
Imports Nexamas.UI.Host
Imports Nexamas.UI.Layout
Imports Nexamas.UI.Theming
Imports SkiaSharp

Namespace Nexamas.UI.Application

    Partial Public NotInheritable Class MASApplicationWindowControls

        ''' <summary>
        ''' Applies an official multi-region MASLayout recipe to direct MAS controls hosted by this window.
        ''' Consumers describe product regions and content intent; MASLayout still produces the final slots.
        ''' </summary>
        <Global.System.ComponentModel.EditorBrowsable(Global.System.ComponentModel.EditorBrowsableState.Advanced)>
        Friend Function LayoutRegions(buildAction As Action(Of MASApplicationLayoutRegionsBuilder)) As Boolean
            Return LayoutRegionsInternal(buildAction, fixedSizeProfile:=Nothing)
        End Function


        <Global.System.ComponentModel.EditorBrowsable(Global.System.ComponentModel.EditorBrowsableState.Advanced)>
        Friend Function LayoutRegions(buildAction As Action(Of MASApplicationLayoutRegionsBuilder),
                                      density As MASControlDensity) As Boolean
            Return LayoutRegionsInternal(buildAction, MASSizeProfile.FromDensity(density))
        End Function


        <Global.System.ComponentModel.EditorBrowsable(Global.System.ComponentModel.EditorBrowsableState.Advanced)>
        Friend Function LayoutRegions(buildAction As Action(Of MASApplicationLayoutRegionsBuilder),
                                      sizeProfile As MASSizeProfile) As Boolean
            Return LayoutRegionsInternal(buildAction, MASSizeProfile.Normalize(sizeProfile))
        End Function


        Private Function LayoutRegionsInternal(buildAction As Action(Of MASApplicationLayoutRegionsBuilder),
                                               fixedSizeProfile As MASSizeProfile) As Boolean
            If buildAction Is Nothing Then Throw New ArgumentNullException(NameOf(buildAction))

            Return ExecuteControlsUiThread(
                "LayoutRegions",
                Function()
                    Dim nextSession As New MASApplicationControlsRegionLayoutSession(_rootHost, Me, buildAction, fixedSizeProfile)
                    Dim applied As Boolean = False

                    Try
                        applied = nextSession.ApplyNow()
                    Catch masCaughtException2 As Exception
                        nextSession.Dispose()
                        Throw
                    End Try

                    If ShouldRetainExistingLayoutSessionAfterFailedApply(applied) Then
                        nextSession.Dispose()
                        Return False
                    End If

                    ClearRetainedLayoutSessionsInternal()
                    _layoutRegionsSession = nextSession
                    Return True
                End Function)
        End Function
    End Class

End Namespace
