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 component affordance shadows that were moved to
    ''' ShadowSystem without changing their visual recipes.
    ''' </summary>
    Friend NotInheritable Class MASVisualComponentShadowOwnershipReport
        Private ReadOnly _flatRoundRectConsumers As IReadOnlyList(Of String)
        Private ReadOnly _flatRectConsumers As IReadOnlyList(Of String)
        Private ReadOnly _flatOvalConsumers As IReadOnlyList(Of String)
        Private ReadOnly _blurredRoundRectConsumers As IReadOnlyList(Of String)

        Friend Sub New(name As String,
                       status As MASVisualComponentShadowOwnershipStatus,
                       hasFlatRoundRectGateway As Boolean,
                       hasFlatRectGateway As Boolean,
                       hasFlatOvalGateway As Boolean,
                       hasBlurredRoundRectGateway As Boolean,
                       localBlurredShadowsRemainInShadowSystem As Boolean,
                       localFlatShadowsRouteThroughShadowSystem As Boolean,
                       flatRoundRectConsumers As IEnumerable(Of String),
                       flatRectConsumers As IEnumerable(Of String),
                       flatOvalConsumers As IEnumerable(Of String),
                       blurredRoundRectConsumers As IEnumerable(Of String))
            Me.Name = Normalize(name, "Nexamas UI Component Shadow Ownership")
            Me.Status = status
            Me.HasFlatRoundRectGateway = hasFlatRoundRectGateway
            Me.HasFlatRectGateway = hasFlatRectGateway
            Me.HasFlatOvalGateway = hasFlatOvalGateway
            Me.HasBlurredRoundRectGateway = hasBlurredRoundRectGateway
            Me.LocalBlurredShadowsRemainInShadowSystem = localBlurredShadowsRemainInShadowSystem
            Me.LocalFlatShadowsRouteThroughShadowSystem = localFlatShadowsRouteThroughShadowSystem

            _flatRoundRectConsumers = New ReadOnlyCollection(Of String)(NormalizeList(flatRoundRectConsumers))
            _flatRectConsumers = New ReadOnlyCollection(Of String)(NormalizeList(flatRectConsumers))
            _flatOvalConsumers = New ReadOnlyCollection(Of String)(NormalizeList(flatOvalConsumers))
            _blurredRoundRectConsumers = New ReadOnlyCollection(Of String)(NormalizeList(blurredRoundRectConsumers))

            Me.FlatRoundRectConsumerCount = _flatRoundRectConsumers.Count
            Me.FlatRectConsumerCount = _flatRectConsumers.Count
            Me.FlatOvalConsumerCount = _flatOvalConsumers.Count
            Me.BlurredRoundRectConsumerCount = _blurredRoundRectConsumers.Count
            Me.TotalAdoptedConsumerCount = FlatRoundRectConsumerCount + FlatRectConsumerCount + FlatOvalConsumerCount + BlurredRoundRectConsumerCount

            Me.IsClosed = status = MASVisualComponentShadowOwnershipStatus.Closed AndAlso
                          HasFlatRoundRectGateway AndAlso
                          HasFlatRectGateway AndAlso
                          HasFlatOvalGateway AndAlso
                          HasBlurredRoundRectGateway AndAlso
                          LocalBlurredShadowsRemainInShadowSystem AndAlso
                          LocalFlatShadowsRouteThroughShadowSystem AndAlso
                          TotalAdoptedConsumerCount >= 5
        End Sub

        Friend ReadOnly Property Name As String
        Friend ReadOnly Property Status As MASVisualComponentShadowOwnershipStatus
        Friend ReadOnly Property HasFlatRoundRectGateway As Boolean
        Friend ReadOnly Property HasFlatRectGateway As Boolean
        Friend ReadOnly Property HasFlatOvalGateway As Boolean
        Friend ReadOnly Property HasBlurredRoundRectGateway As Boolean
        Friend ReadOnly Property LocalBlurredShadowsRemainInShadowSystem As Boolean
        Friend ReadOnly Property LocalFlatShadowsRouteThroughShadowSystem As Boolean
        Friend ReadOnly Property FlatRoundRectConsumerCount As Integer
        Friend ReadOnly Property FlatRectConsumerCount As Integer
        Friend ReadOnly Property FlatOvalConsumerCount As Integer
        Friend ReadOnly Property BlurredRoundRectConsumerCount As Integer
        Friend ReadOnly Property TotalAdoptedConsumerCount As Integer
        Friend ReadOnly Property IsClosed As Boolean

        Friend ReadOnly Property FlatRoundRectConsumers As IReadOnlyList(Of String)
            Get
                Return _flatRoundRectConsumers
            End Get
        End Property

        Friend ReadOnly Property FlatRectConsumers As IReadOnlyList(Of String)
            Get
                Return _flatRectConsumers
            End Get
        End Property

        Friend ReadOnly Property FlatOvalConsumers As IReadOnlyList(Of String)
            Get
                Return _flatOvalConsumers
            End Get
        End Property

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