Option Strict On
Option Explicit On

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

Namespace Nexamas.UI.Rendering

    ''' <summary>
    ''' Friend-only evidence that component-owned broad surfaces use the same Surface/Material
    ''' route through semantic gateways. It deliberately excludes glyphs, charts, progress fills,
    ''' row selection, hover, pressed, focus, and similar interaction chrome from Material scope.
    ''' </summary>
    Friend NotInheritable Class MASVisualSurfaceMaterialCoverageReport
        Private ReadOnly _centralRoutes As IReadOnlyList(Of String)
        Private ReadOnly _componentSurfaceOwners As IReadOnlyList(Of String)
        Private ReadOnly _outOfMaterialScopeBuckets As IReadOnlyList(Of String)

        Friend Sub New(name As String,
                       status As MASVisualSurfaceMaterialCoverageStatus,
                       hasComponentGateway As Boolean,
                       hasNoLowLevelComponentRouteLeaks As Boolean,
                       hasCentralRouteCoverage As Boolean,
                       hasComponentSurfaceCoverage As Boolean,
                       interactiveChromeStaysOutOfMaterialScope As Boolean,
                       centralRoutes As IEnumerable(Of String),
                       componentSurfaceOwners As IEnumerable(Of String),
                       outOfMaterialScopeBuckets As IEnumerable(Of String))
            Me.Name = Normalize(name, "Nexamas UI Surface Material Coverage")
            Me.Status = status
            Me.HasComponentGateway = hasComponentGateway
            Me.HasNoLowLevelComponentRouteLeaks = hasNoLowLevelComponentRouteLeaks
            Me.HasCentralRouteCoverage = hasCentralRouteCoverage
            Me.HasComponentSurfaceCoverage = hasComponentSurfaceCoverage
            Me.InteractiveChromeStaysOutOfMaterialScope = interactiveChromeStaysOutOfMaterialScope
            _centralRoutes = New ReadOnlyCollection(Of String)(NormalizeList(centralRoutes))
            _componentSurfaceOwners = New ReadOnlyCollection(Of String)(NormalizeList(componentSurfaceOwners))
            _outOfMaterialScopeBuckets = New ReadOnlyCollection(Of String)(NormalizeList(outOfMaterialScopeBuckets))
            Me.CentralRouteCount = _centralRoutes.Count
            Me.ComponentSurfaceOwnerCount = _componentSurfaceOwners.Count
            Me.OutOfMaterialScopeBucketCount = _outOfMaterialScopeBuckets.Count
            Me.IsClosed = Status = MASVisualSurfaceMaterialCoverageStatus.Closed AndAlso
                          HasComponentGateway AndAlso
                          HasNoLowLevelComponentRouteLeaks AndAlso
                          HasCentralRouteCoverage AndAlso
                          HasComponentSurfaceCoverage AndAlso
                          InteractiveChromeStaysOutOfMaterialScope AndAlso
                          CentralRouteCount >= 10 AndAlso
                          ComponentSurfaceOwnerCount >= 70 AndAlso
                          OutOfMaterialScopeBucketCount >= 6
        End Sub

        Friend ReadOnly Property Name As String
        Friend ReadOnly Property Status As MASVisualSurfaceMaterialCoverageStatus
        Friend ReadOnly Property HasComponentGateway As Boolean
        Friend ReadOnly Property HasNoLowLevelComponentRouteLeaks As Boolean
        Friend ReadOnly Property HasCentralRouteCoverage As Boolean
        Friend ReadOnly Property HasComponentSurfaceCoverage As Boolean
        Friend ReadOnly Property InteractiveChromeStaysOutOfMaterialScope As Boolean
        Friend ReadOnly Property CentralRouteCount As Integer
        Friend ReadOnly Property ComponentSurfaceOwnerCount As Integer
        Friend ReadOnly Property OutOfMaterialScopeBucketCount As Integer
        Friend ReadOnly Property IsClosed As Boolean

        Friend ReadOnly Property CentralRoutes As IReadOnlyList(Of String)
            Get
                Return _centralRoutes
            End Get
        End Property

        Friend ReadOnly Property ComponentSurfaceOwners As IReadOnlyList(Of String)
            Get
                Return _componentSurfaceOwners
            End Get
        End Property

        Friend ReadOnly Property OutOfMaterialScopeBuckets As IReadOnlyList(Of String)
            Get
                Return _outOfMaterialScopeBuckets
            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
