Option Strict On
Option Explicit On

Imports System
Imports System.Collections.Generic
Imports System.Collections.ObjectModel
Imports System.Globalization
Imports System.Windows.Forms
Imports Nexamas.UI.Architecture
Imports Nexamas.UI.Composition
Imports Nexamas.UI.Controls
Imports Nexamas.UI.General
Imports Nexamas.UI.Layout
Imports Nexamas.UI.Rendering
Imports Nexamas.UI.TextRendering
Imports Nexamas.UI.Theming
Imports Nexamas.UI.Values
Imports SkiaSharp

Namespace Nexamas.UI.Components

    Partial Public NotInheritable Class MASKanbanBoard

#Region "Geometry / pointer state"

        Private Function ResolveWheelColumnIndex(ptPx As SKPoint) As Integer
            Dim columnIndex As Integer = HitTestColumn(ptPx)
            If columnIndex >= 0 Then Return columnIndex
            Return -1
        End Function

        Private Function HitTestColumn(pt As SKPoint) As Integer
            If _columns.Count = 0 Then Return -1
            Dim visibleCapacity As Integer = If(_lastLayoutPlan Is Nothing, KanbanBoardTokens.MaxVisibleColumns, _lastLayoutPlan.MaxVisibleColumns)
            Dim visibleCount As Integer = Math.Min(visibleCapacity, _columns.Count - _leftColumnIndex)
            If visibleCount <= 0 Then Return -1
            For i As Integer = 0 To _columnRects.Count - 1
                If _columnRects(i).Contains(pt.X, pt.Y) Then Return _leftColumnIndex + i
            Next
            Return -1
        End Function

        Private Function HitTestCard(pt As SKPoint) As KanbanCardHit
            For Each hit As KanbanCardHit In _cardHitRects
                If hit.Rect.Contains(pt.X, pt.Y) Then Return hit
            Next
            Return Nothing
        End Function

        Private Sub ResetPointerState()
            If _hoverColumnIndex < 0 AndAlso _hoverCardIndex < 0 AndAlso _pressedColumnIndex < 0 AndAlso _pressedCardIndex < 0 AndAlso _dragTargetColumnIndex < 0 AndAlso Not _draggingCard AndAlso Not _hasPressedPoint Then Return
            _hoverColumnIndex = -1
            _hoverCardIndex = -1
            _pressedColumnIndex = -1
            _pressedCardIndex = -1
            _dragTargetColumnIndex = -1
            _draggingCard = False
            _hasPressedPoint = False
            _pressedPointPx = SKPoint.Empty
            StopKanbanDragFeedbackMotion(resetState:=True)
            InvalidateVisual()
        End Sub

        Private Function TryAutoScrollDragColumn(columnIndex As Integer,
                                                 ptPx As SKPoint) As Boolean
            If columnIndex < 0 OrElse columnIndex >= _columns.Count Then Return False
            Dim visibleRectIndex As Integer = columnIndex - _leftColumnIndex
            If visibleRectIndex < 0 OrElse visibleRectIndex >= _columnRects.Count Then Return False

            Dim column As KanbanColumnState = _columns(columnIndex)
            If column Is Nothing Then Return False
            Dim rect As SKRect = _columnRects(visibleRectIndex)
            Dim zonePx As Single = KanbanBoardTokens.DragAutoScrollZoneDip * Math.Max(0.5F, _lastDpi)
            Dim oldTop As Integer = column.TopCardIndex

            If ptPx.Y <= rect.Top + zonePx Then
                column.TopCardIndex = Math.Max(0, column.TopCardIndex - 1)
            ElseIf ptPx.Y >= rect.Bottom - zonePx Then
                column.TopCardIndex = Math.Min(ResolveColumnMaxTop(column), column.TopCardIndex + 1)
            End If

            Return oldTop <> column.TopCardIndex
        End Function

        Private Shared Function Inset(rect As SKRect,
                                      insetPx As Single) As SKRect
            Return New SKRect(rect.Left + insetPx,
                              rect.Top + insetPx,
                              rect.Right - insetPx,
                              rect.Bottom - insetPx)
        End Function

#End Region

    End Class

End Namespace
