Option Strict On
Option Explicit On

Imports System.Collections.Generic
Imports System.Collections.ObjectModel
Imports System.Linq

Namespace Nexamas.UI.Virtualization

    ''' <summary>
    ''' Immutable output of one virtualized realization pass. Consumers read this plan to realize, retain, or recycle visual
    ''' containers; the plan itself does not touch WinForms controls and does not apply layout.
    ''' </summary>
    Friend NotInheritable Class MASVirtualizationRealizationPlan

        Private ReadOnly _requests As ReadOnlyCollection(Of MASVirtualizationItemRequest)

        Friend Sub New(range As MASVirtualizationRange,
                       requests As IEnumerable(Of MASVirtualizationItemRequest),
                       totalExtentPx As Single,
                       createdContainerCount As Integer,
                       recycledContainerCount As Integer,
                       retainedContainerCount As Integer)
            Me.New(range, requests, CDbl(totalExtentPx), createdContainerCount, recycledContainerCount, retainedContainerCount)
        End Sub

        Friend Sub New(range As MASVirtualizationRange,
                       requests As IEnumerable(Of MASVirtualizationItemRequest),
                       totalExtentPx As Double,
                       createdContainerCount As Integer,
                       recycledContainerCount As Integer,
                       retainedContainerCount As Integer)
            Me.Range = If(range, MASVirtualizationRange.Empty)
            _requests = New ReadOnlyCollection(Of MASVirtualizationItemRequest)(If(requests, Enumerable.Empty(Of MASVirtualizationItemRequest)()).Where(Function(item) item IsNot Nothing).ToArray())
            Me.TotalExtentPxDouble = MASVirtualizationNumericGuard.NormalizeNonNegative(totalExtentPx)
            Me.TotalExtentPx = MASVirtualizationNumericGuard.ToSingleSaturated(Me.TotalExtentPxDouble)
            Me.CreatedContainerCount = Math.Max(0, createdContainerCount)
            Me.RecycledContainerCount = Math.Max(0, recycledContainerCount)
            Me.RetainedContainerCount = Math.Max(0, retainedContainerCount)
        End Sub

        Friend ReadOnly Property Range As MASVirtualizationRange

        Friend ReadOnly Property Requests As IReadOnlyList(Of MASVirtualizationItemRequest)
            Get
                Return _requests
            End Get
        End Property

        Friend ReadOnly Property TotalExtentPx As Single
        Friend ReadOnly Property TotalExtentPxDouble As Double
        Friend ReadOnly Property CreatedContainerCount As Integer
        Friend ReadOnly Property RecycledContainerCount As Integer
        Friend ReadOnly Property RetainedContainerCount As Integer

        Friend ReadOnly Property RealizedCount As Integer
            Get
                Return _requests.Count
            End Get
        End Property

        Friend ReadOnly Property IsEmpty As Boolean
            Get
                Return _requests.Count = 0
            End Get
        End Property

    End Class

End Namespace
