Option Strict On
Option Explicit On

Imports System

Namespace Nexamas.UI.Motion

    ''' <summary>
    ''' Type-linked integration binding proving that a Nexamas UI consumer belongs to the shared motion system boundary.
    ''' </summary>
    Friend NotInheritable Class MASMotionConsumerBinding

        Friend Sub New(consumerType As Type,
                       consumerKind As MASMotionConsumerKind,
                       primaryToken As MASMotionTokenId,
                       description As String,
                       Optional consumesFrameClock As Boolean = False,
                       Optional usesTimelineRunner As Boolean = False,
                       Optional proofKind As MASMotionConsumerProofKind = MASMotionConsumerProofKind.DeclaredContract)
            If consumerType Is Nothing Then Throw New ArgumentNullException(NameOf(consumerType))
            Me.ConsumerType = consumerType
            Me.ConsumerKind = consumerKind
            Me.PrimaryToken = primaryToken
            Me.Description = If(description, String.Empty)

            Dim resolvedProofKind As MASMotionConsumerProofKind = proofKind
            If usesTimelineRunner Then
                resolvedProofKind = MASMotionConsumerProofKind.TimelineRunner
            ElseIf consumesFrameClock Then
                resolvedProofKind = MASMotionConsumerProofKind.FrameConsumer
            End If

            Me.ProofKind = resolvedProofKind
            Me.UsesTimelineRunner = (resolvedProofKind = MASMotionConsumerProofKind.TimelineRunner)
            Me.ConsumesFrameClock = consumesFrameClock OrElse Me.UsesTimelineRunner OrElse resolvedProofKind = MASMotionConsumerProofKind.FrameConsumer
        End Sub

        Friend ReadOnly Property ConsumerType As Type

        Friend ReadOnly Property ConsumerKind As MASMotionConsumerKind

        Friend ReadOnly Property PrimaryToken As MASMotionTokenId

        Friend ReadOnly Property Description As String

        Friend ReadOnly Property ConsumesFrameClock As Boolean

        Friend ReadOnly Property UsesTimelineRunner As Boolean

        Friend ReadOnly Property ProofKind As MASMotionConsumerProofKind

        Friend ReadOnly Property IsRuntimeProven As Boolean
            Get
                Return ProofKind = MASMotionConsumerProofKind.FrameConsumer OrElse ProofKind = MASMotionConsumerProofKind.TimelineRunner
            End Get
        End Property

        Friend ReadOnly Property IsDeclaredOnly As Boolean
            Get
                Return ProofKind = MASMotionConsumerProofKind.DeclaredContract
            End Get
        End Property

        Friend ReadOnly Property IsFloatRuntimeInherited As Boolean
            Get
                Return ProofKind = MASMotionConsumerProofKind.FloatRuntimeInherited
            End Get
        End Property

    End Class

End Namespace
