Option Strict On
Option Explicit On

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

Namespace Nexamas.UI.Rendering

    ''' <summary>
    ''' Evidence-only report for the final Visual folder hygiene pass. It records the
    ''' intended commercial folder contract: component chrome owns contracts/policy/painting,
    ''' Surface owns material/frame/chrome/runtime, and Interaction visual feedback stays out
    ''' of Visual material folders.
    ''' </summary>
    Friend NotInheritable Class MASVisualFolderHygieneReport
        Private ReadOnly _canonicalRoots As IReadOnlyList(Of String)
        Private ReadOnly _retiredRoots As IReadOnlyList(Of String)

        Friend Sub New(status As MASVisualFolderHygieneStatus,
                       canonicalRoots As IEnumerable(Of String),
                       retiredRoots As IEnumerable(Of String),
                       notes As String)
            Me.Status = status
            _canonicalRoots = New ReadOnlyCollection(Of String)(NormalizeList(canonicalRoots))
            _retiredRoots = New ReadOnlyCollection(Of String)(NormalizeList(retiredRoots))
            Me.Notes = Normalize(notes)
        End Sub

        Friend ReadOnly Property Status As MASVisualFolderHygieneStatus

        Friend ReadOnly Property CanonicalRoots As IReadOnlyList(Of String)
            Get
                Return _canonicalRoots
            End Get
        End Property

        Friend ReadOnly Property RetiredRoots As IReadOnlyList(Of String)
            Get
                Return _retiredRoots
            End Get
        End Property

        Friend ReadOnly Property Notes As String

        Friend ReadOnly Property IsClean As Boolean
            Get
                Return Status = MASVisualFolderHygieneStatus.Clean AndAlso
                       ContainsCanonicalRoot("MASSystem/Visual/ComponentChrome/Contracts") AndAlso
                       ContainsCanonicalRoot("MASSystem/Visual/ComponentChrome/Policy") AndAlso
                       ContainsCanonicalRoot("MASSystem/Visual/ComponentChrome/Painting") AndAlso
                       ContainsCanonicalRoot("MASSystem/Visual/Surface/Material") AndAlso
                       ContainsCanonicalRoot("MASSystem/Visual/Surface/Runtime") AndAlso
                       ContainsCanonicalRoot("MASSystem/Interaction/VisualFeedback") AndAlso
                       ContainsRetiredRoot("MASSystem/Visual/ComponentChrome/Action") AndAlso
                       ContainsRetiredRoot("MASSystem/Visual/ComponentChrome/Input") AndAlso
                       ContainsRetiredRoot("MASSystem/Visual/ComponentChrome/Chip")
            End Get
        End Property

        Friend Function ContainsCanonicalRoot(value As String) As Boolean
            Return Contains(CanonicalRoots, value)
        End Function

        Friend Function ContainsRetiredRoot(value As String) As Boolean
            Return Contains(RetiredRoots, value)
        End Function

        Private Shared Function Contains(values As IReadOnlyList(Of String), value As String) As Boolean
            Dim safeValue As String = Normalize(value)
            If safeValue.Length = 0 Then Return False

            For Each candidate As String In values
                If String.Equals(candidate, safeValue, System.StringComparison.Ordinal) Then Return True
            Next

            Return False
        End Function

        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 safeValue As String = Normalize(value)
                If safeValue.Length = 0 Then Continue For
                If Not result.Contains(safeValue) Then result.Add(safeValue)
            Next

            Return result
        End Function

        Private Shared Function Normalize(value As String) As String
            Return If(value, String.Empty).Trim()
        End Function
    End Class

End Namespace
