Option Strict On
Option Explicit On

Imports System
Imports System.Collections.Generic

Namespace Nexamas.UI.Rendering

    ''' <summary>
    ''' Captures current default surface-treatment evidence for low-risk consumers only.
    ''' This builder does not wire renderers, instantiate controls, run captures, or migrate interactive controls.
    ''' </summary>
    Friend NotInheritable Class MASSurfaceTreatmentCurrentVisualCaptureBuilder

        Private Sub New()
        End Sub

        Friend Shared Function BuildLowRiskCurrentVisualCapture() As MASSurfaceTreatmentCurrentVisualCaptureReport
            Dim inventory As MASSurfaceTreatmentOwnershipReport = MASSurfaceTreatmentOwnershipInventoryBuilder.BuildCurrentSurfaceTreatmentInventory()
            Dim entries As New List(Of MASSurfaceTreatmentCurrentVisualCaptureEntry)()

            For Each consumerKind As MASSurfaceTreatmentConsumerKind In MASSurfaceTreatmentConsumerCatalog.CurrentVisualCaptureConsumers()
                entries.Add(BuildCapturedLowRiskEntry(inventory,
                                                      consumerKind,
                                                      MASSurfaceTreatmentConsumerCatalog.DefaultCurrentVisualCaptureFrameStrength(consumerKind),
                                                      BuildCurrentVisualCaptureNotes(consumerKind)))
            Next

            Return New MASSurfaceTreatmentCurrentVisualCaptureReport(
                name:="Surface Treatment Current Visual Capture - Low Risk Consumers",
                entries:=entries.ToArray())
        End Function

        Private Shared Function BuildCapturedLowRiskEntry(inventory As MASSurfaceTreatmentOwnershipReport,
                                                          consumerKind As MASSurfaceTreatmentConsumerKind,
                                                          frameStrength As MASSurfaceFrameStrength,
                                                          notes As String) As MASSurfaceTreatmentCurrentVisualCaptureEntry
            Dim ownership As MASSurfaceTreatmentInventoryEntry = FindEntry(inventory, consumerKind)
            Dim resolution As MASSurfaceTreatmentResolution = MASSurfaceTreatmentResolver.ResolveDefault(consumerKind, frameStrength)
            Dim hasStrengthCoverage As Boolean = HasDefaultFrameStrengthCoverage(consumerKind)
            Dim canCapture As Boolean = ownership IsNot Nothing AndAlso
                                        ownership.ConsumesVisualSurface AndAlso
                                        resolution.CompatibilityStatus = MASSurfaceTreatmentCompatibilityStatus.ResolvedDefaultPreservesCurrentVisual AndAlso
                                        resolution.PreservesDefaultVisualWhenNoOverride

            Dim status As MASSurfaceTreatmentCurrentVisualCaptureStatus = If(canCapture AndAlso hasStrengthCoverage,
                                                                             MASSurfaceTreatmentCurrentVisualCaptureStatus.CapturedLowRiskSurfaceVisualDefaultWithFrameStrengthCoverage,
                                                                             MASSurfaceTreatmentCurrentVisualCaptureStatus.BlockedByIncompleteResolution)

            Return New MASSurfaceTreatmentCurrentVisualCaptureEntry(
                consumerKind:=consumerKind,
                consumerName:=If(ownership Is Nothing, consumerKind.ToString(), ownership.ConsumerName),
                status:=status,
                defaultMaterialKey:=resolution.ResolvedMaterialKey,
                defaultFrameKey:=resolution.ResolvedFrameKey,
                defaultFrameStrength:=resolution.ResolvedFrameStrength,
                themeInfluenceMode:=resolution.ThemeInfluenceMode,
                capturesCurrentDefault:=canCapture,
                capturesMaterialFramePairing:=canCapture AndAlso resolution.UsesRecommendedFrame,
                capturesAllFrameStrengthLevels:=hasStrengthCoverage,
                isLowRiskSurfaceVisualConsumer:=True,
                blocksRuntimeRendererChange:=True,
                blocksHighRiskMigration:=False,
                allowsFutureOverrideThroughResolver:=canCapture AndAlso resolution.IsReadyForCurrentRuntimeConsumption,
                notes:=notes)
        End Function

        Private Shared Function BuildCurrentVisualCaptureNotes(consumerKind As MASSurfaceTreatmentConsumerKind) As String
            Select Case consumerKind
                Case MASSurfaceTreatmentConsumerKind.PanelShellSurface
                    Return "PanelShell/Dialog default treatment is already VisualSurface-owned and is captured without repainting."
                Case MASSurfaceTreatmentConsumerKind.ApplicationChromeSurface
                    Return "Application shell default treatment is captured as an existing VisualSurface consumer without renderer rewiring."
                Case MASSurfaceTreatmentConsumerKind.ProgressSurface
                    Return "Progress container material-key usage is recorded as low-risk default capture; frame pairing remains governance-only."
                Case Else
                    Return MASSurfaceTreatmentConsumerCatalog.ConsumerDisplayName(consumerKind) & " is catalog-owned but not currently enabled for low-risk capture."
            End Select
        End Function
        Private Shared Function HasDefaultFrameStrengthCoverage(consumerKind As MASSurfaceTreatmentConsumerKind) As Boolean
            Dim strengths As MASSurfaceFrameStrength() = New MASSurfaceFrameStrength() {
                MASSurfaceFrameStrength.Level1,
                MASSurfaceFrameStrength.Level2,
                MASSurfaceFrameStrength.Level3,
                MASSurfaceFrameStrength.Level4,
                MASSurfaceFrameStrength.Level5,
                MASSurfaceFrameStrength.Level6
            }

            For Each strength As MASSurfaceFrameStrength In strengths
                Dim resolution As MASSurfaceTreatmentResolution = MASSurfaceTreatmentResolver.ResolveDefault(consumerKind, strength)
                If resolution Is Nothing Then Return False
                If resolution.ResolvedFrameStrength <> strength Then Return False
                If Not String.Equals(resolution.ResolvedFrameKey, MASSurfaceFrameIds.PlatformDefault, StringComparison.OrdinalIgnoreCase) Then Return False
                If resolution.CompatibilityStatus <> MASSurfaceTreatmentCompatibilityStatus.ResolvedDefaultPreservesCurrentVisual Then Return False
            Next

            Return True
        End Function

        Private Shared Function FindEntry(report As MASSurfaceTreatmentOwnershipReport,
                                          consumerKind As MASSurfaceTreatmentConsumerKind) As MASSurfaceTreatmentInventoryEntry
            If report Is Nothing Then Return Nothing

            For Each entry As MASSurfaceTreatmentInventoryEntry In report.Entries
                If entry IsNot Nothing AndAlso entry.ConsumerKind = consumerKind Then Return entry
            Next

            Return Nothing
        End Function

    End Class

End Namespace
