Option Strict On
Option Explicit On

Namespace Nexamas.UI.Rendering

    Friend NotInheritable Class MASSurfaceTreatmentRuntimeSurfaceVisualApplicationReport
        Friend ReadOnly Property Name As String
        Friend ReadOnly Property Entries As MASSurfaceTreatmentRuntimeSurfaceVisualApplicationEntry()
        Friend ReadOnly Property EntryCount As Integer
        Friend ReadOnly Property ReadySurfaceCount As Integer
        Friend ReadOnly Property PreservesDefaultVisuals As Boolean
        Friend ReadOnly Property UsesOfficialResolverAndRegistry As Boolean
        Friend ReadOnly Property ExcludesInteractiveControls As Boolean
        Friend ReadOnly Property ReadyForSurfaceVisualMaterialSelection As Boolean

        Friend Sub New(name As String,
                       entries As MASSurfaceTreatmentRuntimeSurfaceVisualApplicationEntry())
            Me.Name = Normalize(name, "Surface Treatment Runtime Surface Visual Application")
            Me.Entries = If(entries, New MASSurfaceTreatmentRuntimeSurfaceVisualApplicationEntry() {})
            Me.EntryCount = Me.Entries.Length

            Dim ready As Integer = 0
            Dim preserves As Boolean = Me.EntryCount > 0
            Dim official As Boolean = Me.EntryCount > 0
            Dim excludes As Boolean = True

            For Each entry As MASSurfaceTreatmentRuntimeSurfaceVisualApplicationEntry In Me.Entries
                If entry Is Nothing Then
                    preserves = False
                    official = False
                    excludes = False
                    Continue For
                End If
                If entry.IsReady Then ready += 1
                preserves = preserves AndAlso entry.PreservesDefaultVisualWithAuto
                official = official AndAlso entry.UsesOfficialResolver AndAlso entry.UsesOfficialMaterialRegistry
                excludes = excludes AndAlso entry.ExcludesInteractiveControls
            Next

            Me.ReadySurfaceCount = ready
            Me.PreservesDefaultVisuals = preserves
            Me.UsesOfficialResolverAndRegistry = official
            Me.ExcludesInteractiveControls = excludes
            Me.ReadyForSurfaceVisualMaterialSelection = Me.EntryCount = MASSurfaceTreatmentConsumerCatalog.RuntimeSurfaceVisualConsumerCount AndAlso ready = Me.EntryCount AndAlso preserves AndAlso official AndAlso excludes AndAlso ContainsAllRuntimeSurfaceVisualConsumers()
        End Sub

        Friend Function Contains(consumerKind As MASSurfaceTreatmentConsumerKind) As Boolean
            For Each entry As MASSurfaceTreatmentRuntimeSurfaceVisualApplicationEntry In Entries
                If entry IsNot Nothing AndAlso entry.ConsumerKind = consumerKind Then Return True
            Next
            Return False
        End Function


        Private Function ContainsAllRuntimeSurfaceVisualConsumers() As Boolean
            For Each consumerKind As MASSurfaceTreatmentConsumerKind In MASSurfaceTreatmentConsumerCatalog.RuntimeSurfaceVisualConsumers()
                If Not Contains(consumerKind) Then Return False
            Next
            Return True
        End Function
        Private Shared Function Normalize(value As String, fallback As String) As String
            Dim result As String = If(value, String.Empty).Trim()
            If result.Length = 0 Then Return fallback
            Return result
        End Function
    End Class

End Namespace
