Option Strict On
Option Explicit On

Namespace Nexamas.UI.Virtualization

    ''' <summary>
    ''' Immutable internal diagnostic snapshot emitted by MASVirtualizedItemsController. It records the current virtualization facts
    ''' needed by tests, gates, render verification diagnostics, and future showcase diagnostics while keeping all runtime ownership
    ''' inside the virtualization foundation and its consumers.
    ''' </summary>
    Friend NotInheritable Class MASVirtualizationDiagnosticsSnapshot

        Friend Sub New(itemCount As Integer,
                       estimatedItemExtentPx As Single,
                       overscanItemCount As Integer,
                       axis As MASVirtualizationAxis,
                       extentStrategy As MASVirtualizationExtentStrategy,
                       realizedRange As MASVirtualizationRange,
                       realizedCount As Integer,
                       totalExtentPx As Single,
                       viewportOffsetPx As Single,
                       viewportExtentPx As Single,
                       measurementCount As Integer,
                       measurementRevision As Integer,
                       createdLeaseCount As Integer,
                       reusedLeaseCount As Integer,
                       availableLeaseCount As Integer,
                       lastScrollIndex As Integer?,
                       lastScrollTargetOffsetPx As Single?,
                       lastScrollAlignment As MASVirtualizationAlignment?,
                       lastInvalidationReason As MASVirtualizationInvalidationReason)
            Me.ItemCount = Math.Max(0, itemCount)
            Me.EstimatedItemExtentPx = MASVirtualizationNumericGuard.NormalizeNonNegative(estimatedItemExtentPx)
            Me.OverscanItemCount = Math.Max(0, overscanItemCount)
            Me.Axis = axis
            Me.ExtentStrategy = extentStrategy
            Me.RealizedRange = If(realizedRange, MASVirtualizationRange.Empty)
            Me.RealizedCount = Math.Max(0, realizedCount)
            Me.TotalExtentPx = MASVirtualizationNumericGuard.NormalizeNonNegative(totalExtentPx)
            Me.ViewportOffsetPx = MASVirtualizationNumericGuard.NormalizeNonNegative(viewportOffsetPx)
            Me.ViewportExtentPx = MASVirtualizationNumericGuard.NormalizeNonNegative(viewportExtentPx)
            Me.MeasurementCount = Math.Max(0, measurementCount)
            Me.MeasurementRevision = Math.Max(0, measurementRevision)
            Me.CreatedLeaseCount = Math.Max(0, createdLeaseCount)
            Me.ReusedLeaseCount = Math.Max(0, reusedLeaseCount)
            Me.AvailableLeaseCount = Math.Max(0, availableLeaseCount)
            Me.LastScrollIndex = lastScrollIndex
            Me.LastScrollTargetOffsetPx = lastScrollTargetOffsetPx
            Me.LastScrollAlignment = lastScrollAlignment
            Me.LastInvalidationReason = lastInvalidationReason
        End Sub

        Friend ReadOnly Property ItemCount As Integer
        Friend ReadOnly Property EstimatedItemExtentPx As Single
        Friend ReadOnly Property OverscanItemCount As Integer
        Friend ReadOnly Property Axis As MASVirtualizationAxis
        Friend ReadOnly Property ExtentStrategy As MASVirtualizationExtentStrategy
        Friend ReadOnly Property RealizedRange As MASVirtualizationRange
        Friend ReadOnly Property RealizedCount As Integer
        Friend ReadOnly Property TotalExtentPx As Single
        Friend ReadOnly Property ViewportOffsetPx As Single
        Friend ReadOnly Property ViewportExtentPx As Single
        Friend ReadOnly Property MeasurementCount As Integer
        Friend ReadOnly Property MeasurementRevision As Integer
        Friend ReadOnly Property CreatedLeaseCount As Integer
        Friend ReadOnly Property ReusedLeaseCount As Integer
        Friend ReadOnly Property AvailableLeaseCount As Integer
        Friend ReadOnly Property LastScrollIndex As Integer?
        Friend ReadOnly Property LastScrollTargetOffsetPx As Single?
        Friend ReadOnly Property LastScrollAlignment As MASVirtualizationAlignment?
        Friend ReadOnly Property LastInvalidationReason As MASVirtualizationInvalidationReason

        Friend ReadOnly Property HasRealizedItems As Boolean
            Get
                Return RealizedCount > 0 AndAlso Not RealizedRange.IsEmpty
            End Get
        End Property

        Friend ReadOnly Property HasScrollRequest As Boolean
            Get
                Return LastScrollIndex.HasValue AndAlso LastScrollTargetOffsetPx.HasValue AndAlso LastScrollAlignment.HasValue
            End Get
        End Property

    End Class

End Namespace
