Option Strict On
Option Explicit On

Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports Nexamas.UI.Components
Imports Nexamas.UI.Controls
Imports Nexamas.UI.Components.ListPopup
Imports Nexamas.UI.Components.DropDownMenu
Imports Nexamas.UI.FloatRuntime

Namespace Nexamas.UI.Motion

    ''' <summary>
    ''' Integration gate for Motion. It keeps the product type-linked inventory and separates it
    ''' from runtime-proven consumers that are backed by MASMotionFrameClock or MASMotionTimelineRunner.
    ''' </summary>
    Friend NotInheritable Class MASMotionIntegrationGate

        Private Sub New()
        End Sub

        Friend Shared Function EvaluateCurrentConsumers() As MASMotionIntegrationReport
            Dim bindings As IReadOnlyList(Of MASMotionConsumerBinding) = MASMotionConsumerCatalog.GetCurrentConsumers()
            Dim findings As New List(Of MASMotionIntegrationFinding)()

            RequireNoDuplicateBindings(bindings, findings)
            RequireValidProofConsistency(bindings, findings)
            RequireNoDeclaredOnlyBindings(bindings, findings)

            RequireBinding(bindings, GetType(MASButton), MASMotionTokenId.PressDown, findings)
            RequireBinding(bindings, GetType(MASCheckBox), MASMotionTokenId.PressRelease, findings)
            RequireBinding(bindings, GetType(MASRadioButton), MASMotionTokenId.PressRelease, findings)
            RequireBinding(bindings, GetType(MASToggleSwitch), MASMotionTokenId.SelectionMove, findings)
            RequireBinding(bindings, GetType(MASSplitButton), MASMotionTokenId.PressRelease, findings)
            RequireBinding(bindings, GetType(GlyphButton), MASMotionTokenId.PressRelease, findings)
            RequireBinding(bindings, GetType(MASSlider), MASMotionTokenId.ValueScrub, findings)
            RequireBinding(bindings, GetType(MASRating), MASMotionTokenId.ValueChange, findings)
            RequireBinding(bindings, GetType(MASProgressBar), MASMotionTokenId.ValueChange, findings)
            RequireBinding(bindings, GetType(MASBadge), MASMotionTokenId.BadgePulse, findings)
            RequireBinding(bindings, GetType(MASValidationMessage), MASMotionTokenId.ValidationReveal, findings)
            RequireBinding(bindings, GetType(MASStatusBanner), MASMotionTokenId.PanelReveal, findings)
            RequireBinding(bindings, GetType(MASAppliedFiltersBar), MASMotionTokenId.ItemAdd, findings)
            RequireBinding(bindings, GetType(MASAppliedFiltersBar), MASMotionTokenId.ItemRemove, findings)
            RequireBinding(bindings, GetType(MASNotificationPanel), MASMotionTokenId.ItemAdd, findings)
            RequireBinding(bindings, GetType(MASNotificationPanel), MASMotionTokenId.ItemRemove, findings)
            RequireBinding(bindings, GetType(MASFormValidationSummary), MASMotionTokenId.ValidationReveal, findings)
            RequireBinding(bindings, GetType(MASFormValidationSummary), MASMotionTokenId.RowSelectionMove, findings)
            RequireBinding(bindings, GetType(MASExpander), MASMotionTokenId.DisclosureOpen, findings)
            RequireBinding(bindings, GetType(MASExpander), MASMotionTokenId.DisclosureClose, findings)
            RequireBinding(bindings, GetType(MASAccordion), MASMotionTokenId.DisclosureOpen, findings)
            RequireBinding(bindings, GetType(MASAccordion), MASMotionTokenId.DisclosureClose, findings)
            RequireBinding(bindings, GetType(MASSplitView), MASMotionTokenId.PanelReveal, findings)
            RequireBinding(bindings, GetType(MASMasterDetailView), MASMotionTokenId.RowSelectionMove, findings)
            RequireBinding(bindings, GetType(MASDashboardGrid), MASMotionTokenId.SelectionMove, findings)
            RequireBinding(bindings, GetType(MASNavigationRail), MASMotionTokenId.IndicatorMove, findings)
            RequireBinding(bindings, GetType(MASPagination), MASMotionTokenId.IndicatorMove, findings)
            RequireBinding(bindings, GetType(MASBreadcrumb), MASMotionTokenId.IndicatorMove, findings)
            RequireBinding(bindings, GetType(MASListBox), MASMotionTokenId.RowSelectionMove, findings)
            RequireBinding(bindings, GetType(MASListView), MASMotionTokenId.RowSelectionMove, findings)
            RequireBinding(bindings, GetType(MASTreeView), MASMotionTokenId.RowSelectionMove, findings)
            RequireBinding(bindings, GetType(MASTileBox), MASMotionTokenId.SelectionMove, findings)
            RequireBinding(bindings, GetType(MASSelectorItemControl), MASMotionTokenId.RowSelectionMove, findings)
            RequireBinding(bindings, GetType(MASTabControl), MASMotionTokenId.IndicatorMove, findings)
            RequireBinding(bindings, GetType(MASDataGrid), MASMotionTokenId.SelectionMove, findings)
            RequireBinding(bindings, GetType(MASComboBox), MASMotionTokenId.FloatOpen, findings)
            RequireBinding(bindings, GetType(MASDropDownListFloatContent), MASMotionTokenId.FloatOpen, findings)
            RequireBinding(bindings, GetType(MASFloatTransitionEngine), MASMotionTokenId.FloatOpen, findings)
            RequireBinding(bindings, GetType(MASToastFloatContent), MASMotionTokenId.FloatOpen, findings)
            RequireBinding(bindings, GetType(TopBarEngine), MASMotionTokenId.MenuButtonMorph, findings)
            RequireBinding(bindings, GetType(MASContentCarousel), MASMotionTokenId.SelectionMove, findings)
            RequireBinding(bindings, GetType(DropDownMenuFloatContent), MASMotionTokenId.HoverEnter, findings)
            RequireBinding(bindings, GetType(MASMenuBarDropDownFloatContent), MASMotionTokenId.HoverEnter, findings)
            RequireBinding(bindings, GetType(MASDropDownListFloatContent), MASMotionTokenId.HoverEnter, findings)
            RequireBinding(bindings, GetType(MASDatePickerCalendarView), MASMotionTokenId.SelectionMove, findings)
            RequireBinding(bindings, GetType(MASTimePickerClockView), MASMotionTokenId.ValueChange, findings)
            RequireBinding(bindings, GetType(MASColorPicker), MASMotionTokenId.SelectionMove, findings)
            RequireBinding(bindings, GetType(MASColorPicker), MASMotionTokenId.ValueChange, findings)
            RequireBinding(bindings, GetType(MASColorPicker), MASMotionTokenId.ValueScrub, findings)
            RequireBinding(bindings, GetType(MASDateRangePicker), MASMotionTokenId.ValueChange, findings)
            RequireBinding(bindings, GetType(MASCalendarView), MASMotionTokenId.SelectionMove, findings)
            RequireBinding(bindings, GetType(MASTagInput), MASMotionTokenId.SelectionMove, findings)
            RequireBinding(bindings, GetType(MASTransferList), MASMotionTokenId.RowSelectionMove, findings)
            RequireBinding(bindings, GetType(MASTransferList), MASMotionTokenId.DropFeedback, findings)
            RequireBinding(bindings, GetType(MASStepper), MASMotionTokenId.IndicatorMove, findings)
            RequireBinding(bindings, GetType(MASCommandPalette), MASMotionTokenId.RowSelectionMove, findings)
            RequireBinding(bindings, GetType(MASAgendaView), MASMotionTokenId.RowSelectionMove, findings)
            RequireBinding(bindings, GetType(MASKanbanBoard), MASMotionTokenId.RowSelectionMove, findings)
            RequireBinding(bindings, GetType(MASKanbanBoard), MASMotionTokenId.DragFeedback, findings)
            RequireBinding(bindings, GetType(MASKanbanBoard), MASMotionTokenId.DropFeedback, findings)
            RequireBinding(bindings, GetType(MASSidePanel), MASMotionTokenId.PanelReveal, findings)
            RequireBinding(bindings, GetType(MASSidePanel), MASMotionTokenId.PressRelease, findings)
            RequireBinding(bindings, GetType(MASCallout), MASMotionTokenId.PanelReveal, findings)
            RequireBinding(bindings, GetType(MASAvatarOverflowFloatContent), MASMotionTokenId.HoverEnter, findings)

            RequireFrameClockBinding(bindings, GetType(MASButton), MASMotionTokenId.PressDown, findings)
            RequireFrameClockBinding(bindings, GetType(MASCheckBox), MASMotionTokenId.PressRelease, findings)
            RequireFrameClockBinding(bindings, GetType(MASRadioButton), MASMotionTokenId.PressRelease, findings)
            RequireFrameClockBinding(bindings, GetType(MASToggleSwitch), MASMotionTokenId.SelectionMove, findings)
            RequireFrameClockBinding(bindings, GetType(MASSplitButton), MASMotionTokenId.PressRelease, findings)
            RequireFrameClockBinding(bindings, GetType(GlyphButton), MASMotionTokenId.PressRelease, findings)
            RequireFrameClockBinding(bindings, GetType(MASSlider), MASMotionTokenId.ValueScrub, findings)
            RequireFrameClockBinding(bindings, GetType(MASRating), MASMotionTokenId.ValueChange, findings)
            RequireFrameClockBinding(bindings, GetType(MASProgressBar), MASMotionTokenId.ValueChange, findings)
            RequireFrameClockBinding(bindings, GetType(MASBadge), MASMotionTokenId.BadgePulse, findings)
            RequireFrameClockBinding(bindings, GetType(MASValidationMessage), MASMotionTokenId.ValidationReveal, findings)
            RequireFrameClockBinding(bindings, GetType(MASStatusBanner), MASMotionTokenId.PanelReveal, findings)
            RequireFrameClockBinding(bindings, GetType(MASAppliedFiltersBar), MASMotionTokenId.ItemAdd, findings)
            RequireFrameClockBinding(bindings, GetType(MASAppliedFiltersBar), MASMotionTokenId.ItemRemove, findings)
            RequireFrameClockBinding(bindings, GetType(MASNotificationPanel), MASMotionTokenId.ItemAdd, findings)
            RequireFrameClockBinding(bindings, GetType(MASNotificationPanel), MASMotionTokenId.ItemRemove, findings)
            RequireFrameClockBinding(bindings, GetType(MASFormValidationSummary), MASMotionTokenId.ValidationReveal, findings)
            RequireFrameClockBinding(bindings, GetType(MASFormValidationSummary), MASMotionTokenId.RowSelectionMove, findings)
            RequireFrameClockBinding(bindings, GetType(MASExpander), MASMotionTokenId.DisclosureOpen, findings)
            RequireFrameClockBinding(bindings, GetType(MASExpander), MASMotionTokenId.DisclosureClose, findings)
            RequireFrameClockBinding(bindings, GetType(MASAccordion), MASMotionTokenId.DisclosureOpen, findings)
            RequireFrameClockBinding(bindings, GetType(MASAccordion), MASMotionTokenId.DisclosureClose, findings)
            RequireFrameClockBinding(bindings, GetType(MASSplitView), MASMotionTokenId.PanelReveal, findings)
            RequireFrameClockBinding(bindings, GetType(MASMasterDetailView), MASMotionTokenId.RowSelectionMove, findings)
            RequireFrameClockBinding(bindings, GetType(MASDashboardGrid), MASMotionTokenId.SelectionMove, findings)
            RequireFrameClockBinding(bindings, GetType(MASNavigationRail), MASMotionTokenId.IndicatorMove, findings)
            RequireFrameClockBinding(bindings, GetType(MASPagination), MASMotionTokenId.IndicatorMove, findings)
            RequireFrameClockBinding(bindings, GetType(MASBreadcrumb), MASMotionTokenId.IndicatorMove, findings)
            RequireFrameClockBinding(bindings, GetType(MASListBox), MASMotionTokenId.RowSelectionMove, findings)
            RequireFrameClockBinding(bindings, GetType(MASListView), MASMotionTokenId.RowSelectionMove, findings)
            RequireFrameClockBinding(bindings, GetType(MASTreeView), MASMotionTokenId.RowSelectionMove, findings)
            RequireFrameClockBinding(bindings, GetType(MASTileBox), MASMotionTokenId.SelectionMove, findings)
            RequireFrameClockBinding(bindings, GetType(MASSelectorItemControl), MASMotionTokenId.RowSelectionMove, findings)
            RequireFrameClockBinding(bindings, GetType(MASDataGrid), MASMotionTokenId.SelectionMove, findings)
            RequireFrameClockBinding(bindings, GetType(MASTreeGrid), MASMotionTokenId.RowSelectionMove, findings)
            RequireFrameClockBinding(bindings, GetType(MASPropertyGrid), MASMotionTokenId.RowSelectionMove, findings)
            RequireFrameClockBinding(bindings, GetType(MASPivotTable), MASMotionTokenId.SelectionMove, findings)
            RequireFrameClockBinding(bindings, GetType(MASComboBox), MASMotionTokenId.PressDown, findings)
            RequireFrameClockBinding(bindings, GetType(SegmentedControlBox), MASMotionTokenId.SelectionMove, findings)
            RequireFrameClockBinding(bindings, GetType(MASTooltip), MASMotionTokenId.HoverEnter, findings)
            RequireFrameClockBinding(bindings, GetType(MASToastFloatContent), MASMotionTokenId.FloatOpen, findings)
            RequireFrameClockBinding(bindings, GetType(MASTabControl), MASMotionTokenId.SelectionMove, findings)
            RequireFrameClockBinding(bindings, GetType(MASTabControl), MASMotionTokenId.IndicatorMove, findings)
            RequireFrameClockBinding(bindings, GetType(MASContentCarousel), MASMotionTokenId.SelectionMove, findings)
            RequireFrameClockBinding(bindings, GetType(MASFloatTransitionEngine), MASMotionTokenId.FloatOpen, findings)
            RequireFrameClockBinding(bindings, GetType(TopBarEngine), MASMotionTokenId.MenuButtonMorph, findings)
            RequireFrameClockBinding(bindings, GetType(DropDownMenuFloatContent), MASMotionTokenId.HoverEnter, findings)
            RequireFrameClockBinding(bindings, GetType(MASMenuBarDropDownFloatContent), MASMotionTokenId.HoverEnter, findings)
            RequireFrameClockBinding(bindings, GetType(MASDropDownListFloatContent), MASMotionTokenId.HoverEnter, findings)
            RequireFrameClockBinding(bindings, GetType(MASDatePickerCalendarView), MASMotionTokenId.SelectionMove, findings)
            RequireFrameClockBinding(bindings, GetType(MASTimePickerClockView), MASMotionTokenId.ValueChange, findings)
            RequireFrameClockBinding(bindings, GetType(MASColorPicker), MASMotionTokenId.SelectionMove, findings)
            RequireFrameClockBinding(bindings, GetType(MASColorPicker), MASMotionTokenId.ValueChange, findings)
            RequireFrameClockBinding(bindings, GetType(MASColorPicker), MASMotionTokenId.ValueScrub, findings)
            RequireFrameClockBinding(bindings, GetType(MASDateRangePicker), MASMotionTokenId.ValueChange, findings)
            RequireFrameClockBinding(bindings, GetType(MASCalendarView), MASMotionTokenId.SelectionMove, findings)
            RequireFrameClockBinding(bindings, GetType(MASTagInput), MASMotionTokenId.SelectionMove, findings)
            RequireFrameClockBinding(bindings, GetType(MASTransferList), MASMotionTokenId.RowSelectionMove, findings)
            RequireFrameClockBinding(bindings, GetType(MASTransferList), MASMotionTokenId.DropFeedback, findings)
            RequireFrameClockBinding(bindings, GetType(MASStepper), MASMotionTokenId.IndicatorMove, findings)
            RequireFrameClockBinding(bindings, GetType(MASCommandPalette), MASMotionTokenId.RowSelectionMove, findings)
            RequireFrameClockBinding(bindings, GetType(MASAgendaView), MASMotionTokenId.RowSelectionMove, findings)
            RequireFrameClockBinding(bindings, GetType(MASKanbanBoard), MASMotionTokenId.RowSelectionMove, findings)
            RequireFrameClockBinding(bindings, GetType(MASKanbanBoard), MASMotionTokenId.DragFeedback, findings)
            RequireFrameClockBinding(bindings, GetType(MASKanbanBoard), MASMotionTokenId.DropFeedback, findings)
            RequireFrameClockBinding(bindings, GetType(MASSidePanel), MASMotionTokenId.PanelReveal, findings)
            RequireFrameClockBinding(bindings, GetType(MASSidePanel), MASMotionTokenId.PressRelease, findings)
            RequireFrameClockBinding(bindings, GetType(MASCallout), MASMotionTokenId.PanelReveal, findings)
            RequireFrameClockBinding(bindings, GetType(MASAvatarOverflowFloatContent), MASMotionTokenId.HoverEnter, findings)

            RequireTimelineRunnerBinding(bindings, GetType(MASButton), MASMotionTokenId.PressDown, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASCheckBox), MASMotionTokenId.PressRelease, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASRadioButton), MASMotionTokenId.PressRelease, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASToggleSwitch), MASMotionTokenId.SelectionMove, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASSplitButton), MASMotionTokenId.PressRelease, findings)
            RequireTimelineRunnerBinding(bindings, GetType(GlyphButton), MASMotionTokenId.PressRelease, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASSlider), MASMotionTokenId.ValueScrub, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASRating), MASMotionTokenId.ValueChange, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASProgressBar), MASMotionTokenId.ValueChange, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASBadge), MASMotionTokenId.BadgePulse, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASValidationMessage), MASMotionTokenId.ValidationReveal, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASStatusBanner), MASMotionTokenId.PanelReveal, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASAppliedFiltersBar), MASMotionTokenId.ItemAdd, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASAppliedFiltersBar), MASMotionTokenId.ItemRemove, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASNotificationPanel), MASMotionTokenId.ItemAdd, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASNotificationPanel), MASMotionTokenId.ItemRemove, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASFormValidationSummary), MASMotionTokenId.ValidationReveal, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASFormValidationSummary), MASMotionTokenId.RowSelectionMove, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASExpander), MASMotionTokenId.DisclosureOpen, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASExpander), MASMotionTokenId.DisclosureClose, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASAccordion), MASMotionTokenId.DisclosureOpen, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASAccordion), MASMotionTokenId.DisclosureClose, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASSplitView), MASMotionTokenId.PanelReveal, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASMasterDetailView), MASMotionTokenId.RowSelectionMove, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASDashboardGrid), MASMotionTokenId.SelectionMove, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASNavigationRail), MASMotionTokenId.IndicatorMove, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASPagination), MASMotionTokenId.IndicatorMove, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASBreadcrumb), MASMotionTokenId.IndicatorMove, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASListBox), MASMotionTokenId.RowSelectionMove, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASListView), MASMotionTokenId.RowSelectionMove, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASTreeView), MASMotionTokenId.RowSelectionMove, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASTileBox), MASMotionTokenId.SelectionMove, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASSelectorItemControl), MASMotionTokenId.RowSelectionMove, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASDataGrid), MASMotionTokenId.SelectionMove, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASTreeGrid), MASMotionTokenId.RowSelectionMove, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASPropertyGrid), MASMotionTokenId.RowSelectionMove, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASPivotTable), MASMotionTokenId.SelectionMove, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASComboBox), MASMotionTokenId.PressDown, findings)
            RequireTimelineRunnerBinding(bindings, GetType(SegmentedControlBox), MASMotionTokenId.SelectionMove, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASTabControl), MASMotionTokenId.SelectionMove, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASTabControl), MASMotionTokenId.IndicatorMove, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASContentCarousel), MASMotionTokenId.SelectionMove, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASFloatTransitionEngine), MASMotionTokenId.FloatOpen, findings)
            RequireTimelineRunnerBinding(bindings, GetType(TopBarEngine), MASMotionTokenId.MenuButtonMorph, findings)
            RequireTimelineRunnerBinding(bindings, GetType(DropDownMenuFloatContent), MASMotionTokenId.HoverEnter, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASMenuBarDropDownFloatContent), MASMotionTokenId.HoverEnter, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASDropDownListFloatContent), MASMotionTokenId.HoverEnter, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASDatePickerCalendarView), MASMotionTokenId.SelectionMove, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASTimePickerClockView), MASMotionTokenId.ValueChange, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASColorPicker), MASMotionTokenId.SelectionMove, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASColorPicker), MASMotionTokenId.ValueChange, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASColorPicker), MASMotionTokenId.ValueScrub, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASDateRangePicker), MASMotionTokenId.ValueChange, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASCalendarView), MASMotionTokenId.SelectionMove, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASTagInput), MASMotionTokenId.SelectionMove, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASTransferList), MASMotionTokenId.RowSelectionMove, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASTransferList), MASMotionTokenId.DropFeedback, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASStepper), MASMotionTokenId.IndicatorMove, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASCommandPalette), MASMotionTokenId.RowSelectionMove, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASAgendaView), MASMotionTokenId.RowSelectionMove, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASKanbanBoard), MASMotionTokenId.RowSelectionMove, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASKanbanBoard), MASMotionTokenId.DragFeedback, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASKanbanBoard), MASMotionTokenId.DropFeedback, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASSidePanel), MASMotionTokenId.PanelReveal, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASSidePanel), MASMotionTokenId.PressRelease, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASCallout), MASMotionTokenId.PanelReveal, findings)
            RequireTimelineRunnerBinding(bindings, GetType(MASAvatarOverflowFloatContent), MASMotionTokenId.HoverEnter, findings)

            RequireProofKindBinding(bindings, GetType(MASComboBox), MASMotionTokenId.FloatOpen, MASMotionConsumerProofKind.FloatRuntimeInherited, findings)
            RequireProofKindBinding(bindings, GetType(MASDropDownListFloatContent), MASMotionTokenId.FloatOpen, MASMotionConsumerProofKind.FloatRuntimeInherited, findings)
            RequireProofKindBinding(bindings, GetType(MASDrawer), MASMotionTokenId.FloatOpen, MASMotionConsumerProofKind.FloatRuntimeInherited, findings)
            RequireProofKindBinding(bindings, GetType(MASPopover), MASMotionTokenId.FloatOpen, MASMotionConsumerProofKind.FloatRuntimeInherited, findings)

            Return New MASMotionIntegrationReport(bindings, findings)
        End Function

        Private Shared Sub RequireNoDuplicateBindings(bindings As IReadOnlyList(Of MASMotionConsumerBinding),
                                                      findings As List(Of MASMotionIntegrationFinding))
            For i As Integer = 0 To bindings.Count - 1
                Dim first As MASMotionConsumerBinding = bindings(i)
                If first Is Nothing Then
                    findings.Add(New MASMotionIntegrationFinding("MASMotion.NullConsumerBinding", "Motion consumer catalog contains a null binding."))
                    Continue For
                End If

                For j As Integer = i + 1 To bindings.Count - 1
                    Dim second As MASMotionConsumerBinding = bindings(j)
                    If second Is Nothing Then Continue For

                    If first.ConsumerType Is second.ConsumerType AndAlso first.PrimaryToken = second.PrimaryToken AndAlso first.ConsumerKind = second.ConsumerKind AndAlso first.ProofKind = second.ProofKind Then
                        findings.Add(New MASMotionIntegrationFinding("MASMotion.DuplicateConsumerBinding", first.ConsumerType.FullName & " has a duplicate motion binding for token " & first.PrimaryToken.ToString() & " and proof " & first.ProofKind.ToString()))
                    End If
                Next
            Next
        End Sub

        Private Shared Sub RequireValidProofConsistency(bindings As IReadOnlyList(Of MASMotionConsumerBinding),
                                                        findings As List(Of MASMotionIntegrationFinding))
            For Each binding As MASMotionConsumerBinding In bindings
                If binding Is Nothing Then Continue For

                If binding.UsesTimelineRunner AndAlso binding.ProofKind <> MASMotionConsumerProofKind.TimelineRunner Then
                    findings.Add(New MASMotionIntegrationFinding("MASMotion.InvalidTimelineProof", binding.ConsumerType.FullName & " uses a timeline runner flag without TimelineRunner proof."))
                End If

                If binding.IsRuntimeProven AndAlso Not binding.ConsumesFrameClock Then
                    findings.Add(New MASMotionIntegrationFinding("MASMotion.InvalidRuntimeProof", binding.ConsumerType.FullName & " is runtime-proven but not marked as a frame-clock consumer."))
                End If

                If binding.IsDeclaredOnly AndAlso (binding.ConsumesFrameClock OrElse binding.UsesTimelineRunner) Then
                    findings.Add(New MASMotionIntegrationFinding("MASMotion.InvalidDeclaredOnlyProof", binding.ConsumerType.FullName & " is declared-only but also has runtime consumer flags."))
                End If
            Next
        End Sub

        Private Shared Sub RequireNoDeclaredOnlyBindings(bindings As IReadOnlyList(Of MASMotionConsumerBinding),
                                                          findings As List(Of MASMotionIntegrationFinding))
            For Each binding As MASMotionConsumerBinding In bindings
                If binding Is Nothing Then Continue For
                If binding.IsDeclaredOnly Then
                    findings.Add(New MASMotionIntegrationFinding("MASMotion.DeclaredOnlyConsumer", binding.ConsumerType.FullName & " is declared-only. Runtime motion consumers must use TimelineRunner/FrameConsumer proof or explicitly inherit FloatRuntime."))
                End If
            Next
        End Sub

        Private Shared Sub RequireBinding(bindings As IReadOnlyList(Of MASMotionConsumerBinding),
                                          consumerType As Type,
                                          tokenId As MASMotionTokenId,
                                          findings As List(Of MASMotionIntegrationFinding))
            Dim exists As Boolean = bindings.Any(Function(binding) binding IsNot Nothing AndAlso binding.ConsumerType Is consumerType AndAlso binding.PrimaryToken = tokenId)
            If Not exists Then
                findings.Add(New MASMotionIntegrationFinding("MASMotion.MissingRequiredConsumerCode", consumerType.FullName & " is not registered with token " & tokenId.ToString()))
            End If
        End Sub

        Private Shared Sub RequireFrameClockBinding(bindings As IReadOnlyList(Of MASMotionConsumerBinding),
                                                    consumerType As Type,
                                                    tokenId As MASMotionTokenId,
                                                    findings As List(Of MASMotionIntegrationFinding))
            Dim exists As Boolean = bindings.Any(Function(binding) binding IsNot Nothing AndAlso binding.ConsumerType Is consumerType AndAlso binding.PrimaryToken = tokenId AndAlso binding.ConsumesFrameClock)
            If Not exists Then
                findings.Add(New MASMotionIntegrationFinding("MASMotion.MissingFrameClockConsumer", consumerType.FullName & " is not registered as a MASMotionFrameClock consumer for token " & tokenId.ToString()))
            End If
        End Sub

        Private Shared Sub RequireTimelineRunnerBinding(bindings As IReadOnlyList(Of MASMotionConsumerBinding),
                                                        consumerType As Type,
                                                        tokenId As MASMotionTokenId,
                                                        findings As List(Of MASMotionIntegrationFinding))
            Dim exists As Boolean = bindings.Any(Function(binding) binding IsNot Nothing AndAlso binding.ConsumerType Is consumerType AndAlso binding.PrimaryToken = tokenId AndAlso binding.UsesTimelineRunner)
            If Not exists Then
                findings.Add(New MASMotionIntegrationFinding("MASMotion.MissingTimelineRunnerConsumer", consumerType.FullName & " is not registered as a MASMotionTimelineRunner consumer for token " & tokenId.ToString()))
            End If
        End Sub

        Private Shared Sub RequireProofKindBinding(bindings As IReadOnlyList(Of MASMotionConsumerBinding),
                                                   consumerType As Type,
                                                   tokenId As MASMotionTokenId,
                                                   proofKind As MASMotionConsumerProofKind,
                                                   findings As List(Of MASMotionIntegrationFinding))
            Dim exists As Boolean = bindings.Any(Function(binding) binding IsNot Nothing AndAlso binding.ConsumerType Is consumerType AndAlso binding.PrimaryToken = tokenId AndAlso binding.ProofKind = proofKind)
            If Not exists Then
                findings.Add(New MASMotionIntegrationFinding("MASMotion.MissingConsumerProof", consumerType.FullName & " is not registered with " & proofKind.ToString() & " proof for token " & tokenId.ToString()))
            End If
        End Sub

    End Class

End Namespace
