Option Strict On
Option Explicit On

Imports System

Namespace Nexamas.UI.Rendering

    ''' <summary>
    ''' Evidence report for the default-resolution and compatibility-validation pass.
    ''' It validates resolver behavior without making the resolver an active paint path for legacy consumers.
    ''' Runtime surface visual application makes official surface overrides ready; migration-required rows are retained only as a compatibility status for future staged surfaces.
    ''' </summary>
    Friend NotInheritable Class MASSurfaceTreatmentResolutionValidationReport

        Private ReadOnly _resolutions As MASSurfaceTreatmentResolution()

        Friend ReadOnly Property Name As String
        Friend ReadOnly Property ResolutionCount As Integer
        Friend ReadOnly Property DefaultPreservationCount As Integer
        Friend ReadOnly Property OverrideReadyCount As Integer
        Friend ReadOnly Property ConsumerMigrationRequiredCount As Integer
        Friend ReadOnly Property MaterialFallbackCount As Integer
        Friend ReadOnly Property UnknownConsumerBlockerCount As Integer
        Friend ReadOnly Property HasDefaultResolutionCoverage As Boolean
        Friend ReadOnly Property HasOverrideValidationCoverage As Boolean
        Friend ReadOnly Property HasIdentityPreservingOverrideCoverage As Boolean
        Friend ReadOnly Property HasNoParallelResolverBlocker As Boolean
        Friend ReadOnly Property ReadyForConsumerMigrationPlanning As Boolean
        Friend ReadOnly Property ExcludesInteractiveControlConsumers As Boolean

        Friend Sub New(name As String, resolutions As MASSurfaceTreatmentResolution())
            Me.Name = Normalize(name, "Surface Treatment Resolution Validation")
            _resolutions = If(resolutions, New MASSurfaceTreatmentResolution() {})

            ResolutionCount = _resolutions.Length
            DefaultPreservationCount = CountStatus(MASSurfaceTreatmentCompatibilityStatus.ResolvedDefaultPreservesCurrentVisual)
            OverrideReadyCount = CountStatus(MASSurfaceTreatmentCompatibilityStatus.ResolvedOverrideReady)
            ConsumerMigrationRequiredCount = CountStatus(MASSurfaceTreatmentCompatibilityStatus.ResolvedOverrideRequiresConsumerMigration)
            MaterialFallbackCount = CountStatus(MASSurfaceTreatmentCompatibilityStatus.ResolvedWithMaterialFallback)
            UnknownConsumerBlockerCount = CountStatus(MASSurfaceTreatmentCompatibilityStatus.BlockedByUnknownConsumer)

            HasDefaultResolutionCoverage = DefaultPreservationCount >= 3
            HasOverrideValidationCoverage = OverrideReadyCount >= 2 AndAlso MaterialFallbackCount >= 1
            HasIdentityPreservingOverrideCoverage = ContainsMaterial(MASSurfaceMaterialIds.CrystalIce) AndAlso ContainsMaterial(MASSurfaceMaterialIds.WarmPaper)
            HasNoParallelResolverBlocker = CountStatus(MASSurfaceTreatmentCompatibilityStatus.BlockedByParallelSurfacePath) = 0
            ExcludesInteractiveControlConsumers = ExcludesInteractiveControlConsumersFromResolutions()
            ReadyForConsumerMigrationPlanning = ResolutionCount >= 8 AndAlso
                                                HasDefaultResolutionCoverage AndAlso
                                                HasOverrideValidationCoverage AndAlso
                                                HasIdentityPreservingOverrideCoverage AndAlso
                                                ExcludesInteractiveControlConsumers AndAlso
                                                HasNoParallelResolverBlocker
        End Sub

        Friend ReadOnly Property Resolutions As MASSurfaceTreatmentResolution()
            Get
                Return DirectCast(_resolutions.Clone(), MASSurfaceTreatmentResolution())
            End Get
        End Property

        Friend Function ContainsStatus(status As MASSurfaceTreatmentCompatibilityStatus) As Boolean
            For Each resolution As MASSurfaceTreatmentResolution In _resolutions
                If resolution IsNot Nothing AndAlso resolution.CompatibilityStatus = status Then Return True
            Next

            Return False
        End Function

        Private Function ExcludesInteractiveControlConsumersFromResolutions() As Boolean
            For Each resolution As MASSurfaceTreatmentResolution In _resolutions
                If resolution Is Nothing Then Return False
                If Not MASSurfaceTreatmentConsumerCatalog.ExcludesInteractiveControlConsumer(resolution.ConsumerKind) Then Return False
            Next
            Return True
        End Function

        Private Function ContainsConsumer(consumerKind As MASSurfaceTreatmentConsumerKind) As Boolean
            For Each resolution As MASSurfaceTreatmentResolution In _resolutions
                If resolution IsNot Nothing AndAlso resolution.ConsumerKind = consumerKind Then Return True
            Next

            Return False
        End Function

        Private Function CountStatus(status As MASSurfaceTreatmentCompatibilityStatus) As Integer
            Dim count As Integer = 0

            For Each resolution As MASSurfaceTreatmentResolution In _resolutions
                If resolution IsNot Nothing AndAlso resolution.CompatibilityStatus = status Then count += 1
            Next

            Return count
        End Function

        Private Function ContainsMaterial(materialKey As String) As Boolean
            For Each resolution As MASSurfaceTreatmentResolution In _resolutions
                If resolution IsNot Nothing AndAlso String.Equals(resolution.ResolvedMaterialKey, materialKey, StringComparison.OrdinalIgnoreCase) Then Return True
            Next

            Return False
        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
