Option Strict On
Option Explicit On

Imports System.Linq

Namespace Nexamas.UI.CommandActions

    ''' <summary>
    ''' Immutable lifecycle snapshot proving command bindings use weak routes and releasable Button/Toolbar hooks.
    ''' </summary>
    Friend NotInheritable Class MASCommandRegistryLifecycleSnapshot

        Private ReadOnly _records As MASCommandBindingLifecycleRecord()

        Friend Sub New(records As MASCommandBindingLifecycleRecord())
            _records = If(records, New MASCommandBindingLifecycleRecord() {}).Where(Function(record) record IsNot Nothing).ToArray()
        End Sub

        Friend ReadOnly Property Records As MASCommandBindingLifecycleRecord()
            Get
                Return DirectCast(_records.Clone(), MASCommandBindingLifecycleRecord())
            End Get
        End Property

        Friend ReadOnly Property RecordCount As Integer
            Get
                Return _records.Length
            End Get
        End Property

        Friend ReadOnly Property ActiveReleasableBindingCount As Integer
            Get
                Return _records.Where(Function(record) record.IsReleasableSurface AndAlso record.Status = MASCommandBindingLifecycleStatus.Active).Count()
            End Get
        End Property

        Friend ReadOnly Property ReleasedReleasableBindingCount As Integer
            Get
                Return _records.Where(Function(record) record.IsReleasableSurface AndAlso record.Status = MASCommandBindingLifecycleStatus.Released).Count()
            End Get
        End Property

        Friend ReadOnly Property WeakInvocationRouteCount As Integer
            Get
                Return _records.Where(Function(record) record.WeakInvocationRoute).Count()
            End Get
        End Property

        Friend ReadOnly Property HasWeakInvocationRoutes As Boolean
            Get
                Return _records.Length > 0 AndAlso _records.All(Function(record) record.WeakInvocationRoute)
            End Get
        End Property

        Friend ReadOnly Property HasReleasableButtonAndToolbarBindings As Boolean
            Get
                Return HasReleasableBinding(MASCommandBindingSurfaceKind.Button) AndAlso HasReleasableBinding(MASCommandBindingSurfaceKind.Toolbar)
            End Get
        End Property

        Friend ReadOnly Property HasNoActiveReleasableBindings As Boolean
            Get
                Return ActiveReleasableBindingCount = 0
            End Get
        End Property

        Friend ReadOnly Property IsLifecycleHardened As Boolean
            Get
                Return HasWeakInvocationRoutes AndAlso HasReleasableButtonAndToolbarBindings
            End Get
        End Property

        Friend Function HasReleasableBinding(kind As MASCommandBindingSurfaceKind) As Boolean
            Return _records.Any(Function(record) record.SurfaceKind = kind AndAlso record.CanRelease)
        End Function

    End Class

End Namespace
