Option Strict On
Option Explicit On

Imports System

Namespace Nexamas.UI.Virtualization

    ''' <summary>
    ''' Internal governance binding for one Nexamas UI surface that can face large data, large layouts,
    ''' or virtual/windowed item realization. The binding creates a compile-time link to the real surface
    ''' and, for domain-specific windowing surfaces, to the official proof gate that validates bounded behavior.
    ''' </summary>
    Friend NotInheritable Class MASLargeDataWindowingBinding
        Private ReadOnly _proof As Func(Of Boolean)

        Friend Sub New(id As String,
                       displayName As String,
                       surfaceType As Type,
                       strategy As MASLargeDataWindowingStrategy,
                       proofName As String,
                       proof As Func(Of Boolean),
                       usesSharedVirtualizationController As Boolean,
                       hasDomainSpecificWindowingProof As Boolean,
                       sourceProjectionRemainsSurfaceOwned As Boolean,
                       layoutRemainsSurfaceOwned As Boolean,
                       inputRemainsSurfaceOwned As Boolean)
            Me.Id = If(id, String.Empty).Trim()
            Me.DisplayName = If(displayName, String.Empty).Trim()
            Me.SurfaceType = surfaceType
            Me.Strategy = strategy
            Me.ProofName = If(proofName, String.Empty).Trim()
            _proof = proof
            Me.UsesSharedVirtualizationController = usesSharedVirtualizationController
            Me.HasDomainSpecificWindowingProof = hasDomainSpecificWindowingProof
            Me.SourceProjectionRemainsSurfaceOwned = sourceProjectionRemainsSurfaceOwned
            Me.LayoutRemainsSurfaceOwned = layoutRemainsSurfaceOwned
            Me.InputRemainsSurfaceOwned = inputRemainsSurfaceOwned
        End Sub

        Friend ReadOnly Property Id As String
        Friend ReadOnly Property DisplayName As String
        Friend ReadOnly Property SurfaceType As Type
        Friend ReadOnly Property Strategy As MASLargeDataWindowingStrategy
        Friend ReadOnly Property ProofName As String
        Friend ReadOnly Property UsesSharedVirtualizationController As Boolean
        Friend ReadOnly Property HasDomainSpecificWindowingProof As Boolean
        Friend ReadOnly Property SourceProjectionRemainsSurfaceOwned As Boolean
        Friend ReadOnly Property LayoutRemainsSurfaceOwned As Boolean
        Friend ReadOnly Property InputRemainsSurfaceOwned As Boolean

        Friend ReadOnly Property IsSharedControllerSurface As Boolean
            Get
                Return UsesSharedVirtualizationController AndAlso
                       Not HasDomainSpecificWindowingProof AndAlso
                       (Strategy = MASLargeDataWindowingStrategy.SharedVirtualizationController OrElse
                        Strategy = MASLargeDataWindowingStrategy.ComposedSharedVirtualizationController)
            End Get
        End Property

        Friend ReadOnly Property IsDomainSpecificWindowingSurface As Boolean
            Get
                Return HasDomainSpecificWindowingProof AndAlso
                       Not UsesSharedVirtualizationController AndAlso
                       Strategy <> MASLargeDataWindowingStrategy.SharedVirtualizationController AndAlso
                       Strategy <> MASLargeDataWindowingStrategy.ComposedSharedVirtualizationController
            End Get
        End Property

        Friend ReadOnly Property IsStructurallyValid As Boolean
            Get
                Return Id.Length > 0 AndAlso
                       DisplayName.Length > 0 AndAlso
                       SurfaceType IsNot Nothing AndAlso
                       SurfaceType.IsClass AndAlso
                       System.Enum.IsDefined(GetType(MASLargeDataWindowingStrategy), Strategy) AndAlso
                       SourceProjectionRemainsSurfaceOwned AndAlso
                       LayoutRemainsSurfaceOwned AndAlso
                       InputRemainsSurfaceOwned AndAlso
                       (IsSharedControllerSurface OrElse (IsDomainSpecificWindowingSurface AndAlso ProofName.Length > 0 AndAlso _proof IsNot Nothing))
            End Get
        End Property

        Friend Function ExecuteProof() As Boolean
            If IsSharedControllerSurface Then Return True
            If _proof Is Nothing Then Return False
            Return _proof.Invoke()
        End Function

    End Class

End Namespace
