Option Strict On
Option Explicit On

Imports System
Imports System.Collections.Generic
Imports Nexamas.UI.Components.DropDownMenu
Imports SkiaSharp

Namespace Nexamas.UI.Components.ContextMenu

    ''' <summary>
    ''' Ordered logical context-menu scope collection. Resolution is last-added wins,
    ''' matching visual z-order expectations for overlapping Skia controls.
    ''' </summary>
    Friend NotInheritable Class MASContextMenuScopeCollection

        Private ReadOnly _items As New List(Of MASContextMenuScope)()

        Friend ReadOnly Property Count As Integer
            Get
                Return _items.Count
            End Get
        End Property

        Friend Sub Clear()
            _items.Clear()
        End Sub

        Friend Sub Add(key As String,
                       regionLogical As SKRect,
                       buildMenu As Action(Of MASDropDownMenuBuilder))

            If buildMenu Is Nothing Then Throw New ArgumentNullException(NameOf(buildMenu))

            _items.Add(New MASContextMenuScope(
                key:=key,
                regionLogical:=regionLogical,
                buildMenu:=buildMenu
            ))
        End Sub
#Region "SDK Fluent API"

        Friend Function AddScope(key As String,
                                 regionLogical As SKRect,
                                 buildMenu As Action(Of MASDropDownMenuBuilder)) As MASContextMenuScopeCollection

            Add(
                key:=key,
                regionLogical:=regionLogical,
                buildMenu:=buildMenu
            )

            Return Me
        End Function

        Friend Function ClearScopes() As MASContextMenuScopeCollection
            Clear()
            Return Me
        End Function

#End Region

        Friend Function TryResolve(clientPt As SKPoint,
                                   ByRef scope As MASContextMenuScope) As Boolean

            scope = Nothing

            For i As Integer = _items.Count - 1 To 0 Step -1
                Dim s As MASContextMenuScope = _items(i)
                If s Is Nothing Then Continue For

                If s.Contains(clientPt) Then
                    scope = s
                    Return True
                End If
            Next

            Return False
        End Function

    End Class

End Namespace