Option Strict On
Option Explicit On

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

Namespace Nexamas.UI.Rendering

    ''' <summary>
    ''' Friend-only evidence report for the first broad component-surface adoption pass.
    ''' It proves that common card-like surfaces and explicit public surface consumers are
    ''' routed through the official Surface Material runtime without creating element-named
    ''' materials or moving interactive internals into the material system.
    ''' </summary>
    Friend NotInheritable Class MASVisualComponentSurfaceMaterialAdoptionReport
        Private ReadOnly _primitiveConsumers As IReadOnlyList(Of String)
        Private ReadOnly _defaultSurfaceConsumers As IReadOnlyList(Of String)
        Private ReadOnly _directContainerConsumers As IReadOnlyList(Of String)
        Private ReadOnly _frameBackedConsumers As IReadOnlyList(Of String)

        Friend Sub New(name As String,
                       status As MASVisualComponentSurfaceMaterialAdoptionStatus,
                       hasCardPrimitiveRuntimeRoute As Boolean,
                       hasDefaultSurfaceConsumerRuntimeRoute As Boolean,
                       hasDirectContainerRuntimeRoute As Boolean,
                       hasFrameBodyMaterialRoute As Boolean,
                       hasNoExplicitOnlySurfaceGate As Boolean,
                       interactiveInternalsRemainOutOfMaterialScope As Boolean,
                       primitiveConsumers As IEnumerable(Of String),
                       defaultSurfaceConsumers As IEnumerable(Of String),
                       directContainerConsumers As IEnumerable(Of String),
                       frameBackedConsumers As IEnumerable(Of String))
            Me.Name = Normalize(name, "Nexamas UI Component Surface Material Adoption")
            Me.Status = status
            Me.HasCardPrimitiveRuntimeRoute = hasCardPrimitiveRuntimeRoute
            Me.HasDefaultSurfaceConsumerRuntimeRoute = hasDefaultSurfaceConsumerRuntimeRoute
            Me.HasDirectContainerRuntimeRoute = hasDirectContainerRuntimeRoute
            Me.HasFrameBodyMaterialRoute = hasFrameBodyMaterialRoute
            Me.HasNoExplicitOnlySurfaceGate = hasNoExplicitOnlySurfaceGate
            Me.InteractiveInternalsRemainOutOfMaterialScope = interactiveInternalsRemainOutOfMaterialScope
            _primitiveConsumers = New ReadOnlyCollection(Of String)(NormalizeList(primitiveConsumers))
            _defaultSurfaceConsumers = New ReadOnlyCollection(Of String)(NormalizeList(defaultSurfaceConsumers))
            _directContainerConsumers = New ReadOnlyCollection(Of String)(NormalizeList(directContainerConsumers))
            _frameBackedConsumers = New ReadOnlyCollection(Of String)(NormalizeList(frameBackedConsumers))

            Me.PrimitiveConsumerCount = _primitiveConsumers.Count
            Me.DefaultSurfaceConsumerCount = _defaultSurfaceConsumers.Count
            Me.DirectContainerConsumerCount = _directContainerConsumers.Count
            Me.FrameBackedConsumerCount = _frameBackedConsumers.Count
            Me.IsClosed = status = MASVisualComponentSurfaceMaterialAdoptionStatus.Closed AndAlso
                          HasCardPrimitiveRuntimeRoute AndAlso
                          HasDefaultSurfaceConsumerRuntimeRoute AndAlso
                          HasDirectContainerRuntimeRoute AndAlso
                          HasFrameBodyMaterialRoute AndAlso
                          HasNoExplicitOnlySurfaceGate AndAlso
                          InteractiveInternalsRemainOutOfMaterialScope AndAlso
                          PrimitiveConsumerCount >= 27 AndAlso
                          DefaultSurfaceConsumerCount >= 7 AndAlso
                          DirectContainerConsumerCount >= 5 AndAlso
                          FrameBackedConsumerCount >= 6
        End Sub

        Friend ReadOnly Property Name As String
        Friend ReadOnly Property Status As MASVisualComponentSurfaceMaterialAdoptionStatus
        Friend ReadOnly Property HasCardPrimitiveRuntimeRoute As Boolean
        Friend ReadOnly Property HasDefaultSurfaceConsumerRuntimeRoute As Boolean
        Friend ReadOnly Property HasDirectContainerRuntimeRoute As Boolean
        Friend ReadOnly Property HasFrameBodyMaterialRoute As Boolean
        Friend ReadOnly Property HasNoExplicitOnlySurfaceGate As Boolean
        Friend ReadOnly Property InteractiveInternalsRemainOutOfMaterialScope As Boolean
        Friend ReadOnly Property PrimitiveConsumerCount As Integer
        Friend ReadOnly Property DefaultSurfaceConsumerCount As Integer
        Friend ReadOnly Property DirectContainerConsumerCount As Integer
        Friend ReadOnly Property FrameBackedConsumerCount As Integer
        Friend ReadOnly Property IsClosed As Boolean

        Friend ReadOnly Property PrimitiveConsumers As IReadOnlyList(Of String)
            Get
                Return _primitiveConsumers
            End Get
        End Property

        Friend ReadOnly Property DefaultSurfaceConsumers As IReadOnlyList(Of String)
            Get
                Return _defaultSurfaceConsumers
            End Get
        End Property

        Friend ReadOnly Property DirectContainerConsumers As IReadOnlyList(Of String)
            Get
                Return _directContainerConsumers
            End Get
        End Property

        Friend ReadOnly Property FrameBackedConsumers As IReadOnlyList(Of String)
            Get
                Return _frameBackedConsumers
            End Get
        End Property

        Private Shared Function NormalizeList(values As IEnumerable(Of String)) As List(Of String)
            Dim result As New List(Of String)()
            If values Is Nothing Then Return result

            For Each value As String In values
                Dim normalized As String = Normalize(value, String.Empty)
                If normalized.Length > 0 AndAlso Not result.Contains(normalized) Then result.Add(normalized)
            Next

            Return result
        End Function

        Private Shared Function Normalize(value As String, fallback As String) As String
            Dim safe As String = If(value, String.Empty).Trim()
            If safe.Length = 0 Then Return If(fallback, String.Empty).Trim()
            Return safe
        End Function
    End Class

End Namespace
