Option Strict On
Option Explicit On

Namespace Nexamas.UI.Components

    ''' <summary>
    ''' Friend-only evidence manifest for MASFileDropZone. It proves the element is an
    ''' official Nexamas UI visual intake surface without owning picker dialogs, OS drag/drop
    ''' plumbing, upload transport, storage, thumbnails, scanning, or background transfer.
    ''' </summary>
    Friend NotInheritable Class MASFileDropZoneReadinessManifest
        Friend Sub New(name As String,
                       status As MASFileDropZoneReadinessStatus,
                       hasArchitectureContract As Boolean,
                       hasApplicationGateway As Boolean,
                       hasThemeSurfaceRoute As Boolean,
                       hasSizeLayoutRoute As Boolean,
                       hasNoFilePickerWrapper As Boolean,
                       hasUploadTransportBoundary As Boolean,
                       hasHostDragDropBoundary As Boolean,
                       hasNoBackgroundTransferPath As Boolean)
            Me.Name = If(name, String.Empty)
            Me.Status = status
            Me.HasArchitectureContract = hasArchitectureContract
            Me.HasApplicationGateway = hasApplicationGateway
            Me.HasThemeSurfaceRoute = hasThemeSurfaceRoute
            Me.HasSizeLayoutRoute = hasSizeLayoutRoute
            Me.HasNoFilePickerWrapper = hasNoFilePickerWrapper
            Me.HasUploadTransportBoundary = hasUploadTransportBoundary
            Me.HasHostDragDropBoundary = hasHostDragDropBoundary
            Me.HasNoBackgroundTransferPath = hasNoBackgroundTransferPath
        End Sub

        Friend ReadOnly Property Name As String
        Friend ReadOnly Property Status As MASFileDropZoneReadinessStatus
        Friend ReadOnly Property HasArchitectureContract As Boolean
        Friend ReadOnly Property HasApplicationGateway As Boolean
        Friend ReadOnly Property HasThemeSurfaceRoute As Boolean
        Friend ReadOnly Property HasSizeLayoutRoute As Boolean
        Friend ReadOnly Property HasNoFilePickerWrapper As Boolean
        Friend ReadOnly Property HasUploadTransportBoundary As Boolean
        Friend ReadOnly Property HasHostDragDropBoundary As Boolean
        Friend ReadOnly Property HasNoBackgroundTransferPath As Boolean

        Friend ReadOnly Property IsReady As Boolean
            Get
                Return Status = MASFileDropZoneReadinessStatus.Ready OrElse
                       Status = MASFileDropZoneReadinessStatus.ReadyWithHostDragDropBoundary
            End Get
        End Property

        Friend Shared Function CreateDefault() As MASFileDropZoneReadinessManifest
            Dim noPickerWrapper As Boolean = MASFileDropZonePolicy.HasNoFilePickerWrapper()
            Dim uploadBoundary As Boolean = MASFileDropZonePolicy.HasUploadTransportBoundary()
            Dim hostBoundary As Boolean = MASFileDropZonePolicy.HasHostDragDropBoundary()
            Dim noBackgroundTransfer As Boolean = MASFileDropZonePolicy.HasNoBackgroundTransferPath()

            Dim status As MASFileDropZoneReadinessStatus = MASFileDropZoneReadinessStatus.Ready
            If Not noPickerWrapper Then status = MASFileDropZoneReadinessStatus.BlockedByFilePickerWrapper
            If Not uploadBoundary OrElse Not noBackgroundTransfer Then status = MASFileDropZoneReadinessStatus.BlockedByParallelUploader
            If hostBoundary AndAlso status = MASFileDropZoneReadinessStatus.Ready Then status = MASFileDropZoneReadinessStatus.ReadyWithHostDragDropBoundary

            Return New MASFileDropZoneReadinessManifest(
                name:="MASFileDropZone",
                status:=status,
                hasArchitectureContract:=True,
                hasApplicationGateway:=True,
                hasThemeSurfaceRoute:=True,
                hasSizeLayoutRoute:=True,
                hasNoFilePickerWrapper:=noPickerWrapper,
                hasUploadTransportBoundary:=uploadBoundary,
                hasHostDragDropBoundary:=hostBoundary,
                hasNoBackgroundTransferPath:=noBackgroundTransfer)
        End Function
    End Class

End Namespace
