Option Strict On
Option Explicit On

Namespace Nexamas.UI.Rendering

    ''' <summary>
    ''' Report for the first low-risk runtime alignment pass.
    ''' It proves only material-key resolution moved through the governance route; frame repaint remains deferred.
    ''' </summary>
    Friend NotInheritable Class MASSurfaceTreatmentRuntimeAlignmentReport

        Private ReadOnly _entries As MASSurfaceTreatmentRuntimeAlignmentEntry()

        Friend ReadOnly Property Name As String

        Friend Sub New(name As String,
                       entries As MASSurfaceTreatmentRuntimeAlignmentEntry())
            Me.Name = Normalize(name, "Surface Treatment Low-Risk Runtime Alignment")
            Me._entries = If(entries, New MASSurfaceTreatmentRuntimeAlignmentEntry() {})
        End Sub

        Friend ReadOnly Property Entries As MASSurfaceTreatmentRuntimeAlignmentEntry()
            Get
                Return CType(_entries.Clone(), MASSurfaceTreatmentRuntimeAlignmentEntry())
            End Get
        End Property

        Friend ReadOnly Property EntryCount As Integer
            Get
                Return _entries.Length
            End Get
        End Property

        Friend ReadOnly Property LowRiskAlignedCount As Integer
            Get
                Dim count As Integer = 0
                For Each entry As MASSurfaceTreatmentRuntimeAlignmentEntry In _entries
                    If entry IsNot Nothing AndAlso entry.IsAligned Then count += 1
                Next
                Return count
            End Get
        End Property

        Friend ReadOnly Property HighRiskBlockedCount As Integer
            Get
                Dim count As Integer = 0
                For Each entry As MASSurfaceTreatmentRuntimeAlignmentEntry In _entries
                    If entry IsNot Nothing AndAlso entry.BlocksHighRiskMigration Then count += 1
                Next
                Return count
            End Get
        End Property

        Friend ReadOnly Property HasPanelShellRuntimeAlignment As Boolean
            Get
                Return ContainsAlignedConsumer(MASSurfaceTreatmentConsumerKind.PanelShellSurface)
            End Get
        End Property

        Friend ReadOnly Property HasApplicationChromeRuntimeAlignment As Boolean
            Get
                Return ContainsAlignedConsumer(MASSurfaceTreatmentConsumerKind.ApplicationChromeSurface)
            End Get
        End Property

        Friend ReadOnly Property HasProgressRuntimeAlignment As Boolean
            Get
                Return ContainsAlignedConsumer(MASSurfaceTreatmentConsumerKind.ProgressSurface)
            End Get
        End Property

        Friend ReadOnly Property HasLowRiskRuntimeAlignment As Boolean
            Get
                Return ContainsAllAlignedConsumers(MASSurfaceTreatmentConsumerCatalog.LowRiskRuntimeAlignedConsumers())
            End Get
        End Property

        Friend ReadOnly Property ExcludesInteractiveControls As Boolean
            Get
                For Each entry As MASSurfaceTreatmentRuntimeAlignmentEntry In _entries
                    If entry Is Nothing Then Return False
                    If Not MASSurfaceTreatmentConsumerCatalog.ExcludesInteractiveControlConsumer(entry.ConsumerKind) Then Return False
                Next
                Return True
            End Get
        End Property

        Friend ReadOnly Property DefersFrameRepaintForAllAlignedConsumers As Boolean
            Get
                For Each entry As MASSurfaceTreatmentRuntimeAlignmentEntry In _entries
                    If entry IsNot Nothing AndAlso entry.IsAligned AndAlso Not entry.DefersFrameRepaint Then Return False
                Next
                Return LowRiskAlignedCount > 0
            End Get
        End Property

        Friend ReadOnly Property ReadyForLowRiskFramePairingPlanning As Boolean
            Get
                Return HasLowRiskRuntimeAlignment AndAlso
                       EntryCount = MASSurfaceTreatmentConsumerCatalog.LowRiskRuntimeAlignedConsumerCount AndAlso
                       LowRiskAlignedCount = MASSurfaceTreatmentConsumerCatalog.LowRiskRuntimeAlignedConsumerCount AndAlso
                       HighRiskBlockedCount = 0 AndAlso
                       ExcludesInteractiveControls AndAlso
                       DefersFrameRepaintForAllAlignedConsumers
            End Get
        End Property

        Friend Function ContainsStatus(status As MASSurfaceTreatmentRuntimeAlignmentStatus) As Boolean
            For Each entry As MASSurfaceTreatmentRuntimeAlignmentEntry In _entries
                If entry IsNot Nothing AndAlso entry.Status = status Then Return True
            Next
            Return False
        End Function


        Friend Function ContainsConsumerKind(consumerKind As MASSurfaceTreatmentConsumerKind) As Boolean
            For Each entry As MASSurfaceTreatmentRuntimeAlignmentEntry In _entries
                If entry IsNot Nothing AndAlso entry.ConsumerKind = consumerKind Then Return True
            Next
            Return False
        End Function

        Private Function ContainsAllAlignedConsumers(consumers As MASSurfaceTreatmentConsumerKind()) As Boolean
            If consumers Is Nothing OrElse consumers.Length = 0 Then Return False

            For Each consumerKind As MASSurfaceTreatmentConsumerKind In consumers
                If Not ContainsAlignedConsumer(consumerKind) Then Return False
            Next

            Return True
        End Function
        Private Function ContainsAlignedConsumer(consumerKind As MASSurfaceTreatmentConsumerKind) As Boolean
            For Each entry As MASSurfaceTreatmentRuntimeAlignmentEntry In _entries
                If entry IsNot Nothing AndAlso entry.ConsumerKind = consumerKind AndAlso entry.IsAligned Then Return True
            Next
            Return False
        End Function

        Private Function ContainsBlockedConsumer(consumerKind As MASSurfaceTreatmentConsumerKind) As Boolean
            For Each entry As MASSurfaceTreatmentRuntimeAlignmentEntry In _entries
                If entry IsNot Nothing AndAlso entry.ConsumerKind = consumerKind AndAlso entry.BlocksHighRiskMigration 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
