Option Strict On
Option Explicit On

Imports System

Namespace Nexamas.UI.Application

    ''' <summary>
    ''' Official MASApplicationWindow settings facade. It exposes owned Application settings surfaces without exposing
    ''' sizing internals, layout nodes, or direct bounds APIs to consumers.
    ''' </summary>
    Friend NotInheritable Class MASApplicationWindowSettings
        Implements IDisposable

        Private ReadOnly _window As MASApplicationWindow
        Private _currentPage As MASApplicationSettingsPage
        Private _currentWindowSession As MASApplicationSettingsWindowSession
        Private _disposed As Boolean

        Friend Sub New(window As MASApplicationWindow)
            If window Is Nothing Then Throw New ArgumentNullException(NameOf(window))
            _window = window
        End Sub

        Friend Function CreateApplicationSettingsPage(Optional options As MASApplicationSettingsPageOptions = Nothing) As MASApplicationSettingsPage
            ThrowIfDisposed()
            Return MASApplicationSettingsPage.CreateFor(_window, options)
        End Function

        Friend Function ShowApplicationSettingsPage(Optional options As MASApplicationSettingsPageOptions = Nothing) As MASApplicationSettingsPageResult
            ThrowIfDisposed()
            Return ShowOwnedPage(MASApplicationSettingsPageOptions.Normalize(options))
        End Function

        <Global.System.Obsolete("Size Profile is now a section inside Application Settings. Use ShowApplicationSettingsPage instead.", False),
         Global.System.ComponentModel.EditorBrowsable(Global.System.ComponentModel.EditorBrowsableState.Never)>
        Friend Function ShowSizingSettingsPage(Optional options As MASApplicationSettingsPageOptions = Nothing) As MASApplicationSettingsPageResult
            ThrowIfDisposed()

            Dim effectiveOptions As MASApplicationSettingsPageOptions = MASApplicationSettingsPageOptions.Normalize(options)
            effectiveOptions.IncludeSizingSection = True
            effectiveOptions.IncludePreviewControls = If(options Is Nothing, True, effectiveOptions.IncludePreviewControls)

            Return ShowOwnedPage(effectiveOptions)
        End Function

        Friend Function ShowApplicationSettingsWindow(Optional options As MASApplicationSettingsPageOptions = Nothing) As MASApplicationSettingsWindowSession
            ThrowIfDisposed()
            DisposeCurrentWindowSession()

            Dim session As New MASApplicationSettingsWindowSession(_window, MASApplicationSettingsPageOptions.Normalize(options))
            _currentWindowSession = session
            session.Show()
            Return session
        End Function

        <Global.System.Obsolete("Size Profile is now a section inside Application Settings. Use ShowApplicationSettingsWindow instead.", False),
         Global.System.ComponentModel.EditorBrowsable(Global.System.ComponentModel.EditorBrowsableState.Never)>
        Friend Function ShowSizingSettingsWindow(Optional options As MASApplicationSettingsPageOptions = Nothing) As MASApplicationSettingsWindowSession
            ThrowIfDisposed()

            Dim effectiveOptions As MASApplicationSettingsPageOptions = MASApplicationSettingsPageOptions.Normalize(options)
            effectiveOptions.IncludeSizingSection = True
            effectiveOptions.IncludePreviewControls = If(options Is Nothing, True, effectiveOptions.IncludePreviewControls)

            Return ShowApplicationSettingsWindow(effectiveOptions)
        End Function

        Friend Sub DismissApplicationSettingsWindow()
            DisposeCurrentWindowSession()
        End Sub

        Friend Sub DismissApplicationSettingsPage(Optional clearControls As Boolean = False)
            DisposeCurrentPage()
            If clearControls AndAlso Not _window.IsDisposed Then
                _window.Controls.Clear()
            End If
        End Sub

        Friend Sub ClearOwnedSettingsPage()
            DismissApplicationSettingsPage(clearControls:=False)
        End Sub

        Private Function ShowOwnedPage(options As MASApplicationSettingsPageOptions) As MASApplicationSettingsPageResult
            DisposeCurrentPage()

            Dim page As MASApplicationSettingsPage = MASApplicationSettingsPage.CreateFor(_window, options)
            Dim result As MASApplicationSettingsPageResult = page.Show()

            If result IsNot Nothing AndAlso result.Succeeded Then
                _currentPage = page
            Else
                page.Dispose()
            End If

            Return result
        End Function

        Private Sub DisposeCurrentPage()
            If _currentPage Is Nothing Then Return
            _currentPage.Dispose()
            _currentPage = Nothing
        End Sub

        Private Sub DisposeCurrentWindowSession()
            If _currentWindowSession Is Nothing Then Return
            _currentWindowSession.Dispose()
            _currentWindowSession = Nothing
        End Sub

        Public Sub Dispose() Implements IDisposable.Dispose
            If _disposed Then Return
            _disposed = True
            DisposeCurrentWindowSession()
            DisposeCurrentPage()
        End Sub

        Private Sub ThrowIfDisposed()
            If _disposed Then Throw New ObjectDisposedException(NameOf(MASApplicationWindowSettings))
        End Sub

    End Class

End Namespace
