Option Strict On
Option Explicit On

Namespace Nexamas.UI.Rendering

    ''' <summary>
    ''' Report for low-risk current-visual capture evidence.
    ''' The report verifies default treatment preservation before any renderer migration occurs.
    ''' </summary>
    Friend NotInheritable Class MASSurfaceTreatmentCurrentVisualCaptureReport

        Private ReadOnly _entries As MASSurfaceTreatmentCurrentVisualCaptureEntry()

        Friend ReadOnly Property Name As String

        Friend Sub New(name As String,
                       entries As MASSurfaceTreatmentCurrentVisualCaptureEntry())
            Me.Name = Normalize(name, "Surface Treatment Current Visual Capture")
            Me._entries = If(entries, New MASSurfaceTreatmentCurrentVisualCaptureEntry() {})
        End Sub

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

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

        Friend ReadOnly Property LowRiskCapturedCount As Integer
            Get
                Dim count As Integer = 0
                For Each entry As MASSurfaceTreatmentCurrentVisualCaptureEntry In _entries
                    If entry IsNot Nothing AndAlso entry.IsLowRiskSurfaceVisualConsumer AndAlso entry.IsCaptured 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 MASSurfaceTreatmentCurrentVisualCaptureEntry In _entries
                    If entry IsNot Nothing AndAlso entry.BlocksHighRiskMigration Then count += 1
                Next
                Return count
            End Get
        End Property

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

        Friend ReadOnly Property HasLowRiskCurrentVisualCapture As Boolean
            Get
                Return ContainsAllCapturedConsumers(MASSurfaceTreatmentConsumerCatalog.CurrentVisualCaptureConsumers())
            End Get
        End Property

        Friend ReadOnly Property HasFrameStrengthCoverage As Boolean
            Get
                Return FrameStrengthCoverageCount >= LowRiskCapturedCount AndAlso LowRiskCapturedCount > 0
            End Get
        End Property

        Friend ReadOnly Property ExcludesInteractiveControls As Boolean
            Get
                For Each entry As MASSurfaceTreatmentCurrentVisualCaptureEntry 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 HasNoRuntimeRendererChange As Boolean
            Get
                If _entries.Length = 0 Then Return False
                For Each entry As MASSurfaceTreatmentCurrentVisualCaptureEntry In _entries
                    If entry Is Nothing OrElse Not entry.BlocksRuntimeRendererChange Then Return False
                Next
                Return True
            End Get
        End Property

        Friend ReadOnly Property ReadyForLowRiskRuntimeAlignmentPlanning As Boolean
            Get
                Return HasLowRiskCurrentVisualCapture AndAlso
                       EntryCount = MASSurfaceTreatmentConsumerCatalog.CurrentVisualCaptureConsumerCount AndAlso
                       LowRiskCapturedCount = MASSurfaceTreatmentConsumerCatalog.CurrentVisualCaptureConsumerCount AndAlso
                       HasFrameStrengthCoverage AndAlso
                       HighRiskBlockedCount = 0 AndAlso
                       ExcludesInteractiveControls AndAlso
                       HasNoRuntimeRendererChange
            End Get
        End Property

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

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


        Private Function ContainsAllCapturedConsumers(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 ContainsCapturedConsumer(consumerKind) Then Return False
            Next

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

        Private Function ContainsBlockedConsumer(consumerKind As MASSurfaceTreatmentConsumerKind) As Boolean
            For Each entry As MASSurfaceTreatmentCurrentVisualCaptureEntry 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
