Option Strict On
Option Explicit On

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

Namespace Nexamas.UI.Rendering

    Friend NotInheritable Class MASVisualMaterialRegionCompositionReport
        Private ReadOnly _evidence As IReadOnlyList(Of String)

        Friend Sub New(name As String,
                       status As MASVisualMaterialRegionCompositionStatus,
                       hasFriendOnlyComposition As Boolean,
                       hasSemanticGatewayRoutes As Boolean,
                       hasImageViewerAuthoringProof As Boolean,
                       exposesNoPublicRegionMaterialApi As Boolean,
                       evidence As IEnumerable(Of String))
            Me.Name = Normalize(name, "Nexamas UI Material Region Composition")
            Me.Status = status
            Me.HasFriendOnlyComposition = hasFriendOnlyComposition
            Me.HasSemanticGatewayRoutes = hasSemanticGatewayRoutes
            Me.HasImageViewerAuthoringProof = hasImageViewerAuthoringProof
            Me.ExposesNoPublicRegionMaterialApi = exposesNoPublicRegionMaterialApi
            _evidence = New ReadOnlyCollection(Of String)(NormalizeList(evidence))
        End Sub

        Friend ReadOnly Property Name As String
        Friend ReadOnly Property Status As MASVisualMaterialRegionCompositionStatus
        Friend ReadOnly Property HasFriendOnlyComposition As Boolean
        Friend ReadOnly Property HasSemanticGatewayRoutes As Boolean
        Friend ReadOnly Property HasImageViewerAuthoringProof As Boolean
        Friend ReadOnly Property ExposesNoPublicRegionMaterialApi As Boolean

        Friend ReadOnly Property Evidence As IReadOnlyList(Of String)
            Get
                Return _evidence
            End Get
        End Property

        Friend ReadOnly Property IsClosed As Boolean
            Get
                Return Status = MASVisualMaterialRegionCompositionStatus.Closed AndAlso
                       HasFriendOnlyComposition AndAlso
                       HasSemanticGatewayRoutes AndAlso
                       HasImageViewerAuthoringProof AndAlso
                       ExposesNoPublicRegionMaterialApi
            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 result As String = If(value, String.Empty).Trim()
            If result.Length = 0 Then Return fallback
            Return result
        End Function
    End Class

End Namespace
