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 the official semantic application-surface MASLayout recipe to direct MAS controls hosted by this window.
        ''' This is the preferred full-screen API for command bars, navigation/side regions, true workspaces,
        ''' inspectors, and footers. It computes regions from intent and still uses the canonical MASLayout engine for slots.
        ''' </summary>
        Public Function LayoutApplicationSurface(buildAction As Action(Of MASApplicationSurfaceLayoutBuilder)) As Boolean
            Return LayoutApplicationSurfaceInternal(buildAction, fixedSizeProfile:=Nothing)
        End Function


        Public Function LayoutApplicationSurface(buildAction As Action(Of MASApplicationSurfaceLayoutBuilder),
                                        density As MASControlDensity) As Boolean
            Return LayoutApplicationSurfaceInternal(buildAction, MASSizeProfile.FromDensity(density))
        End Function


        Public Function LayoutApplicationSurface(buildAction As Action(Of MASApplicationSurfaceLayoutBuilder),
                                        sizeProfile As MASSizeProfile) As Boolean
            Return LayoutApplicationSurfaceInternal(buildAction, MASSizeProfile.Normalize(sizeProfile))
        End Function


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

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

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

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

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

End Namespace
