Option Strict On
Option Explicit On

Imports System.Collections.Generic

Namespace Nexamas.UI.Virtualization

    ''' <summary>
    ''' Readiness gate for MASVirtualizedItemsSystem. It validates the reusable virtualization foundation before any consumer
    ''' attempts realization, recycling, measurement-cache use, scroll-to-index, or selection integration.
    ''' </summary>
    Friend NotInheritable Class MASVirtualizationGate

        Friend Const MissingOptionsCode As String = "MASVirtualization.MissingOptions"
        Friend Const InvalidEstimatedExtentCode As String = "MASVirtualization.InvalidEstimatedExtent"
        Friend Const InvalidItemCountCode As String = "MASVirtualization.InvalidItemCount"
        Friend Const InvalidOverscanCode As String = "MASVirtualization.InvalidOverscan"
        Friend Const InvalidAxisCode As String = "MASVirtualization.InvalidAxis"
        Friend Const InvalidExtentStrategyCode As String = "MASVirtualization.InvalidExtentStrategy"

        Private Sub New()
        End Sub

        Friend Shared Function Evaluate(options As MASVirtualizationOptions) As MASVirtualizationReadinessReport
            Dim findings = New List(Of MASVirtualizationReadinessFinding)()

            If options Is Nothing Then
                findings.Add(New MASVirtualizationReadinessFinding(MissingOptionsCode, "Virtualization options are required.", MASVirtualizationFindingSeverity.Error))
                Return New MASVirtualizationReadinessReport(0, 0.0F, 0, findings, MASVirtualizationExtentStrategy.EstimatedWithMeasuredOverrides)
            End If

            If options.ItemCount < 0 Then
                findings.Add(New MASVirtualizationReadinessFinding(InvalidItemCountCode, "Item count must not be negative.", MASVirtualizationFindingSeverity.Error))
            End If

            If Not MASVirtualizationNumericGuard.IsFinitePositive(options.EstimatedItemExtentPx) Then
                findings.Add(New MASVirtualizationReadinessFinding(InvalidEstimatedExtentCode, "Estimated item extent must be a finite value greater than zero.", MASVirtualizationFindingSeverity.Error))
            End If

            If options.OverscanItemCount < 0 Then
                findings.Add(New MASVirtualizationReadinessFinding(InvalidOverscanCode, "Overscan count must not be negative.", MASVirtualizationFindingSeverity.Error))
            End If

            If Not System.Enum.IsDefined(GetType(MASVirtualizationAxis), options.Axis) Then
                findings.Add(New MASVirtualizationReadinessFinding(InvalidAxisCode, "Virtualization axis must be a defined MASVirtualizationAxis value.", MASVirtualizationFindingSeverity.Error))
            End If

            If Not System.Enum.IsDefined(GetType(MASVirtualizationExtentStrategy), options.ExtentStrategy) Then
                findings.Add(New MASVirtualizationReadinessFinding(InvalidExtentStrategyCode, "Virtualization extent strategy must be a defined MASVirtualizationExtentStrategy value.", MASVirtualizationFindingSeverity.Error))
            End If

            Return New MASVirtualizationReadinessReport(options.ItemCount, options.EstimatedItemExtentPx, options.OverscanItemCount, findings, options.ExtentStrategy)
        End Function

    End Class

End Namespace
