Option Strict On
Option Explicit On

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

Namespace Nexamas.UI.Application

    Friend Enum MASApplicationSettingsPageResultStatus
        Shown = 0
        WindowUnavailable = 1
        NoSections = 2
        LayoutFailed = 3
    End Enum

    ''' <summary>
    ''' Immutable result returned after an owned MAS Application settings page is applied to a window.
    ''' </summary>
    Friend NotInheritable Class MASApplicationSettingsPageResult

        Private ReadOnly _controls As IReadOnlyList(Of MASControlBase)

        Private Sub New(status As MASApplicationSettingsPageResultStatus,
                        controls As IReadOnlyList(Of MASControlBase),
                        message As String)
            Me.Status = status
            _controls = If(controls, Array.AsReadOnly(New MASControlBase() {}))
            Me.Message = If(message, String.Empty)
        End Sub

        Friend ReadOnly Property Status As MASApplicationSettingsPageResultStatus
        Friend ReadOnly Property Message As String

        Friend ReadOnly Property Controls As IReadOnlyList(Of MASControlBase)
            Get
                Return _controls
            End Get
        End Property

        Friend ReadOnly Property Succeeded As Boolean
            Get
                Return Status = MASApplicationSettingsPageResultStatus.Shown
            End Get
        End Property

        Friend Shared Function Shown(controls As IReadOnlyList(Of MASControlBase)) As MASApplicationSettingsPageResult
            Return New MASApplicationSettingsPageResult(MASApplicationSettingsPageResultStatus.Shown, controls, String.Empty)
        End Function

        Friend Shared Function Failed(status As MASApplicationSettingsPageResultStatus,
                                      message As String) As MASApplicationSettingsPageResult
            Return New MASApplicationSettingsPageResult(status, Array.AsReadOnly(New MASControlBase() {}), message)
        End Function

    End Class

End Namespace
