Option Strict On
Option Explicit On

Namespace Nexamas.UI.FloatRuntime

    ' ============================================================
    ' MASFloatRuntime Contract
    ' Class: MASFloatResult
    '
    ' Purpose:
    '   Represents the unified final result of a Float session.
    '
    ' Responsibility:
    '   Carries final status, optional value, and optional error message
    '   after a Float has completed its lifecycle.
    '
    ' Owns:
    '   Result status.
    '   Result value.
    '   Error message.
    '
    ' Does Not Own:
    '   Lifecycle state.
    '   Close authorization.
    '   Callback delivery.
    '   Host removal.
    '
    ' Allowed Dependencies:
    '   MASFloatResultStatus.
    '
    ' Forbidden Dependencies:
    '   Legacy Overlay classes.
    '   MASFloatCoordinator.
    '   MASFloatRuntimeState.
    '   MASFloatHost.
    '
    ' Lifecycle Role:
    '   Stored by Coordinator during completion and exposed only through
    '   MASFloatClosedEventArgs after Closed.
    '
    ' Threading:
    '   Immutable after construction and safe to pass between runtime and
    '   external callbacks.
    '
    ' Mutation Rules:
    '   No public setters.
    '   Create new result instances instead of mutating existing ones.
    '
    ' Invariants:
    '   None has no value and no error message.
    '   Cancelled and Dismissed may carry a domain result value when the user action is meaningful.
    '   Failed should carry an error message when available.
    '   External result delivery must happen only after Closed.
    '
    ' Failure Rules:
    '   Null error messages are normalized to an empty string.
    ' ============================================================
    Friend NotInheritable Class MASFloatResult

        Friend Shared ReadOnly Property None As MASFloatResult =
            New MASFloatResult(MASFloatResultStatus.None, Nothing, String.Empty)

        Friend ReadOnly Property Status As MASFloatResultStatus

        Friend ReadOnly Property Value As Object

        Friend ReadOnly Property ErrorMessage As String

        Friend Sub New(status As MASFloatResultStatus, value As Object)
            Me.New(status, value, String.Empty)
        End Sub

        Friend Sub New(
            status As MASFloatResultStatus,
            value As Object,
            errorMessage As String
        )
            Me.Status = status
            Me.Value = value
            Me.ErrorMessage = If(errorMessage, String.Empty)
        End Sub

        Friend Shared Function Accepted(value As Object) As MASFloatResult
            Return New MASFloatResult(MASFloatResultStatus.Accepted, value, String.Empty)
        End Function

        Friend Shared Function Cancelled() As MASFloatResult
            Return Cancelled(Nothing)
        End Function

        Friend Shared Function Cancelled(value As Object) As MASFloatResult
            Return New MASFloatResult(MASFloatResultStatus.Cancelled, value, String.Empty)
        End Function

        Friend Shared Function Dismissed() As MASFloatResult
            Return Dismissed(Nothing)
        End Function

        Friend Shared Function Dismissed(value As Object) As MASFloatResult
            Return New MASFloatResult(MASFloatResultStatus.Dismissed, value, String.Empty)
        End Function

        Friend Shared Function Failed(errorMessage As String) As MASFloatResult
            Return New MASFloatResult(MASFloatResultStatus.Failed, Nothing, errorMessage)
        End Function

    End Class

End Namespace