Option Strict On
Option Explicit On

Imports Nexamas.UI.FloatRuntime

Namespace Nexamas.UI.Application

    ''' <summary>
    ''' Public SDK result for showing a dialog, panel, toast host, file surface, or other Float-backed application surface.
    ''' </summary>
    ''' <remarks>
    ''' This type preserves the precise FloatRuntime outcome without exposing internal FloatRuntime result classes.
    ''' Compatibility APIs still return MASApplicationSurfaceHandle, but *Ex APIs return this object so callers can
    ''' distinguish Opened, Queued, Reused, and Rejected outcomes without treating Nothing as an ambiguous signal.
    ''' </remarks>
    Public NotInheritable Class MASApplicationSurfaceShowResult

        Private Sub New(status As MASApplicationSurfaceShowStatus,
                        handle As MASApplicationSurfaceHandle,
                        reason As String)
            Me.Status = status
            Me.Handle = handle
            Me.Reason = If(reason, String.Empty)
        End Sub

        Public ReadOnly Property Status As MASApplicationSurfaceShowStatus

        Public ReadOnly Property Handle As MASApplicationSurfaceHandle

        Public ReadOnly Property Reason As String

        Public ReadOnly Property HasHandle As Boolean
            Get
                Return Handle IsNot Nothing
            End Get
        End Property

        Public ReadOnly Property IsAccepted As Boolean
            Get
                Return Status = MASApplicationSurfaceShowStatus.Opened OrElse
                       Status = MASApplicationSurfaceShowStatus.Queued OrElse
                       Status = MASApplicationSurfaceShowStatus.Reused
            End Get
        End Property

        Public Shared Function Opened(handle As MASApplicationSurfaceHandle) As MASApplicationSurfaceShowResult
            Return New MASApplicationSurfaceShowResult(MASApplicationSurfaceShowStatus.Opened, handle, String.Empty)
        End Function

        Public Shared Function Queued(Optional reason As String = "Queued by surface policy.") As MASApplicationSurfaceShowResult
            Return New MASApplicationSurfaceShowResult(MASApplicationSurfaceShowStatus.Queued, Nothing, reason)
        End Function

        Public Shared Function Reused(handle As MASApplicationSurfaceHandle) As MASApplicationSurfaceShowResult
            Return New MASApplicationSurfaceShowResult(MASApplicationSurfaceShowStatus.Reused, handle, String.Empty)
        End Function

        Public Shared Function Rejected(reason As String) As MASApplicationSurfaceShowResult
            Return New MASApplicationSurfaceShowResult(MASApplicationSurfaceShowStatus.Rejected, Nothing, reason)
        End Function

        Friend Shared Function FromFloatShowResult(result As MASFloatShowResult) As MASApplicationSurfaceShowResult
            If result Is Nothing Then
                Return Rejected("FloatRuntime returned no show result.")
            End If

            Dim appHandle As MASApplicationSurfaceHandle = MASApplicationSurfaceHandle.FromFloatHandle(result.Handle)

            Select Case result.Status
                Case MASFloatShowStatus.Opened
                    Return Opened(appHandle)
                Case MASFloatShowStatus.Queued
                    Return Queued(result.Reason)
                Case MASFloatShowStatus.Reused
                    Return Reused(appHandle)
                Case MASFloatShowStatus.Rejected
                    Return Rejected(result.Reason)
                Case Else
                    Return Rejected("Unsupported Float show status: " & result.Status.ToString())
            End Select
        End Function

        Friend Shared Function FromFloatHandle(handle As MASFloatHandle) As MASApplicationSurfaceShowResult
            If handle Is Nothing Then Return Rejected("No surface handle was returned.")
            Return Opened(MASApplicationSurfaceHandle.FromFloatHandle(handle))
        End Function

        Public Overrides Function ToString() As String
            Return "MASApplicationSurfaceShowResult(Status=" & Status.ToString() &
                   ", HasHandle=" & HasHandle.ToString(Global.System.Globalization.CultureInfo.InvariantCulture) &
                   If(String.IsNullOrEmpty(Reason), String.Empty, ", Reason=" & Reason) & ")"
        End Function

    End Class

End Namespace
