Option Strict On
Option Explicit On

Namespace Nexamas.UI.Virtualization

    ''' <summary>
    ''' Immutable benchmark scenario for MASVirtualizedItemsSystem. Scenarios are deterministic and runtime-safe; they measure the
    ''' virtualized planning contracts only and never allocate UI controls, Skia surfaces, files, or item containers.
    ''' </summary>
    Friend NotInheritable Class MASVirtualizationBenchmarkScenario

        Friend Sub New(id As String,
                       itemCount As Integer,
                       estimatedItemExtentPx As Single,
                       viewportExtentPx As Single,
                       targetIndex As Integer,
                       Optional overscanItemCount As Integer = 2,
                       Optional extentStrategy As MASVirtualizationExtentStrategy = MASVirtualizationExtentStrategy.EstimatedWithMeasuredOverrides)
            Me.Id = If(id, String.Empty).Trim()
            Me.ItemCount = Math.Max(0, itemCount)
            Me.EstimatedItemExtentPx = estimatedItemExtentPx
            Me.ViewportExtentPx = MASVirtualizationNumericGuard.NormalizeNonNegative(viewportExtentPx)
            Me.TargetIndex = Math.Max(0, targetIndex)
            Me.OverscanItemCount = Math.Max(0, overscanItemCount)
            Me.ExtentStrategy = extentStrategy
        End Sub

        Friend ReadOnly Property Id As String
        Friend ReadOnly Property ItemCount As Integer
        Friend ReadOnly Property EstimatedItemExtentPx As Single
        Friend ReadOnly Property ViewportExtentPx As Single
        Friend ReadOnly Property TargetIndex As Integer
        Friend ReadOnly Property OverscanItemCount As Integer
        Friend ReadOnly Property ExtentStrategy As MASVirtualizationExtentStrategy

        Friend ReadOnly Property IsValid As Boolean
            Get
                Return Id.Length > 0 AndAlso
                       ItemCount > 0 AndAlso
                       MASVirtualizationNumericGuard.IsFinitePositive(EstimatedItemExtentPx) AndAlso
                       MASVirtualizationNumericGuard.IsFinitePositive(ViewportExtentPx) AndAlso
                       System.Enum.IsDefined(GetType(MASVirtualizationExtentStrategy), ExtentStrategy)
            End Get
        End Property

    End Class

End Namespace
