Option Strict On
Option Explicit On

Imports Nexamas.UI.FloatRuntime

Namespace Nexamas.UI.Application

    ''' <summary>
    ''' Public SDK shield options for Application-owned dialog/panel flows.
    ''' Internally translated to MASFloatShieldOptions without exposing FloatRuntime as SDK surface.
    ''' </summary>
    Public NotInheritable Class MASApplicationDialogShieldOptions

        Public Shared ReadOnly Property None As MASApplicationDialogShieldOptions =
            New MASApplicationDialogShieldOptions(MASApplicationDialogShieldMode.None)

        Public Property Mode As MASApplicationDialogShieldMode

        Public Property Reason As MASApplicationDialogShieldReason = MASApplicationDialogShieldReason.None

        Public Property AllowCancel As Boolean = True

        Public Property AllowEscape As Boolean = False

        Public Property AllowOutsideDismiss As Boolean = False

        Public Property AllowReplace As Boolean = False

        Public Property AllowCloseAll As Boolean = False

        Public Property BlockHigherLayer As Boolean = False

        Public Sub New(mode As MASApplicationDialogShieldMode)
            Me.Mode = mode
        End Sub

        Public Function Clone() As MASApplicationDialogShieldOptions
            Return New MASApplicationDialogShieldOptions(Me.Mode) With {
                .Reason = Me.Reason,
                .AllowCancel = Me.AllowCancel,
                .AllowEscape = Me.AllowEscape,
                .AllowOutsideDismiss = Me.AllowOutsideDismiss,
                .AllowReplace = Me.AllowReplace,
                .AllowCloseAll = Me.AllowCloseAll,
                .BlockHigherLayer = Me.BlockHigherLayer
            }
        End Function

        Friend Function ToFloatShieldOptions() As MASFloatShieldOptions
            Return New MASFloatShieldOptions(ToFloatShieldMode(Me.Mode)) With {
                .Reason = ToFloatShieldReason(Me.Reason),
                .AllowCancel = Me.AllowCancel,
                .AllowEscape = Me.AllowEscape,
                .AllowOutsideDismiss = Me.AllowOutsideDismiss,
                .AllowReplace = Me.AllowReplace,
                .AllowCloseAll = Me.AllowCloseAll,
                .BlockHigherLayer = Me.BlockHigherLayer
            }
        End Function

        Private Shared Function ToFloatShieldMode(mode As MASApplicationDialogShieldMode) As MASFloatShieldMode
            Select Case mode
                Case MASApplicationDialogShieldMode.Soft
                    Return MASFloatShieldMode.Soft
                Case MASApplicationDialogShieldMode.DecisionRequired
                    Return MASFloatShieldMode.DecisionRequired
                Case MASApplicationDialogShieldMode.SystemLocked
                    Return MASFloatShieldMode.SystemLocked
                Case Else
                    Return MASFloatShieldMode.None
            End Select
        End Function

        Private Shared Function ToFloatShieldReason(reason As MASApplicationDialogShieldReason) As MASFloatShieldReason
            Select Case reason
                Case MASApplicationDialogShieldReason.RequiresUserDecision
                    Return MASFloatShieldReason.RequiresUserDecision
                Case MASApplicationDialogShieldReason.CriticalConfirmation
                    Return MASFloatShieldReason.CriticalConfirmation
                Case MASApplicationDialogShieldReason.InProgressOperation
                    Return MASFloatShieldReason.InProgressOperation
                Case MASApplicationDialogShieldReason.PreventDataLoss
                    Return MASFloatShieldReason.PreventDataLoss
                Case MASApplicationDialogShieldReason.OwnedModalFlow
                    Return MASFloatShieldReason.OwnedModalFlow
                Case Else
                    Return MASFloatShieldReason.None
            End Select
        End Function

    End Class

End Namespace
