Option Strict On
Option Explicit On

Namespace Nexamas.UI.Components

    ''' <summary>
    ''' Friend-only proof for KanbanBoard WIP/drop-rule behavior. It verifies that
    ''' legal targets are accepted, illegal drops produce deterministic feedback,
    ''' target indexes are normalized, and keyboard/public move paths use the same
    ''' bounded board model without exposing a workflow engine.
    ''' </summary>
    Friend NotInheritable Class MASKanbanBoardWipDropRulesGate
        Private Sub New()
        End Sub

        Friend Shared Function Passes() As Boolean
            Try
                If Not MASKanbanBoardPolicy.HasWipDropRuleContractPath() Then Return False

                Dim board As MASKanbanBoard = MASKanbanBoard.Create("WIP/drop rules")
                board.AddColumn("todo", "Todo")
                board.AddColumn("doing", "Doing")
                board.AddCard("todo", "a", "A")
                board.AddCard("todo", "b", "B")
                If board.ColumnCount <> 2 OrElse board.CardCount <> 2 Then Return False

                Dim missingCard As MASKanbanBoardDropRuleSnapshot = board.CreateDropRuleSnapshot("missing", "doing", 0)
                If missingCard Is Nothing OrElse missingCard.IsLegalTarget OrElse Not missingCard.HasRejectedDropFeedback Then Return False

                Dim missingColumn As MASKanbanBoardDropRuleSnapshot = board.CreateDropRuleSnapshot("a", "missing", 0)
                If missingColumn Is Nothing OrElse missingColumn.IsLegalTarget OrElse Not missingColumn.HasRejectedDropFeedback Then Return False

                Dim legalDrop As MASKanbanBoardDropRuleSnapshot = board.CreateDropRuleSnapshot("a", "doing", 0)
                If legalDrop Is Nothing OrElse Not legalDrop.IsLegalTarget Then Return False
                If legalDrop.ResolvedTargetCardIndex <> 0 Then Return False
                If legalDrop.IsNoOp Then Return False

                If Not board.MoveCardToIndex("a", "doing", -10) Then Return False
                If board.GetCardKeys("doing").Count <> 1 Then Return False
                If board.GetCardKeys("doing")(0) <> "a" Then Return False
                If board.SelectedCardKey <> "a" Then Return False

                If Not board.SelectCard("b") Then Return False
                If Not board.MoveSelectedCardToColumn("doing") Then Return False
                If board.GetCardKeys("doing").Count <> 2 Then Return False
                If board.GetCardKeys("todo").Count <> 0 Then Return False

                Dim noop As MASKanbanBoardDropRuleSnapshot = board.CreateDropRuleSnapshot("b", "doing", board.GetCardKeys("doing").Count - 1)
                If noop Is Nothing OrElse Not noop.IsLegalTarget OrElse Not noop.HasRejectedDropFeedback Then Return False

                Return True
            Catch ex As System.Exception
                Nexamas.UI.Diagnostics.MASExceptionSilencer.SwallowDiagnosticOnly(ex, "MASKanbanBoardWipDropRulesGate")
                Return False
            End Try
        End Function
    End Class

End Namespace
