Option Strict On
Option Explicit On

Imports System.Collections.Generic

Namespace Nexamas.UI.Rendering

    ''' <summary>
    ''' Builds evidence for the first low-risk runtime material alignment.
    ''' This validates resolver use for PanelShell, Application chrome, and Progress only.
    ''' </summary>
    Friend NotInheritable Class MASSurfaceTreatmentRuntimeAlignmentBuilder

        Private Sub New()
        End Sub

        Friend Shared Function BuildLowRiskRuntimeAlignment() As MASSurfaceTreatmentRuntimeAlignmentReport
            Dim capture As MASSurfaceTreatmentCurrentVisualCaptureReport = MASSurfaceTreatmentCurrentVisualCaptureBuilder.BuildLowRiskCurrentVisualCapture
            Dim entries As New List(Of MASSurfaceTreatmentRuntimeAlignmentEntry)()

            For Each consumerKind As MASSurfaceTreatmentConsumerKind In MASSurfaceTreatmentConsumerCatalog.LowRiskRuntimeAlignedConsumers()
                entries.Add(BuildAlignedEntry(capture,
                                              consumerKind,
                                              MASSurfaceTreatmentConsumerCatalog.DefaultLowRiskRuntimeFrameStrength(consumerKind),
                                              BuildRuntimeAlignmentNotes(consumerKind)))
            Next

            Return New MASSurfaceTreatmentRuntimeAlignmentReport(
                name:="Surface Treatment Low-Risk Runtime Alignment",
                entries:=entries.ToArray())
        End Function

        Private Shared Function BuildAlignedEntry(capture As MASSurfaceTreatmentCurrentVisualCaptureReport,
                                                  consumerKind As MASSurfaceTreatmentConsumerKind,
                                                  frameStrength As MASSurfaceFrameStrength,
                                                  notes As String) As MASSurfaceTreatmentRuntimeAlignmentEntry
            Dim resolution As MASSurfaceTreatmentResolution = MASSurfaceTreatmentRuntimeSurfaceVisual.ResolveRuntimeResolution(
                consumerKind:=consumerKind,
                requestedMaterialKey:=MASSurfaceMaterialIds.Auto,
                requestedFrameStrength:=frameStrength,
                hasExplicitMaterialOverride:=False)

            Dim canAlign As Boolean = capture IsNot Nothing AndAlso
                                      capture.ReadyForLowRiskRuntimeAlignmentPlanning AndAlso
                                      MASSurfaceTreatmentRuntimeSurfaceVisual.IsLowRiskSurfaceVisualConsumer(consumerKind) AndAlso
                                      resolution IsNot Nothing AndAlso
                                      resolution.CompatibilityStatus = MASSurfaceTreatmentCompatibilityStatus.ResolvedDefaultPreservesCurrentVisual AndAlso
                                      resolution.PreservesDefaultVisualWhenNoOverride

            Dim status As MASSurfaceTreatmentRuntimeAlignmentStatus = If(canAlign,
                                                                         MASSurfaceTreatmentRuntimeAlignmentStatus.AlignedLowRiskRuntimeSurfaceVisualRoute,
                                                                         MASSurfaceTreatmentRuntimeAlignmentStatus.BlockedByIncompleteResolver)

            Return New MASSurfaceTreatmentRuntimeAlignmentEntry(
                consumerKind:=consumerKind,
                consumerName:=MASSurfaceTreatmentConsumerCatalog.ConsumerDisplayName(consumerKind),
                status:=status,
                resolvedMaterialKey:=If(resolution Is Nothing, MASSurfaceMaterialIds.PlatformDefault, resolution.ResolvedMaterialKey),
                resolvedFrameKey:=If(resolution Is Nothing, MASSurfaceFrameIds.PlatformDefault, resolution.ResolvedFrameKey),
                resolvedFrameStrength:=frameStrength,
                themeInfluenceMode:=If(resolution Is Nothing, MASSurfaceTreatmentThemeInfluenceMode.ThemeBound, resolution.ThemeInfluenceMode),
                usesRuntimeResolver:=canAlign,
                preservesDefaultVisual:=canAlign,
                alignsMaterialOnly:=canAlign,
                DefersFrameRepaint:=canAlign,
                blocksHighRiskMigration:=False,
                notes:=notes)
        End Function
        Private Shared Function BuildRuntimeAlignmentNotes(consumerKind As MASSurfaceTreatmentConsumerKind) As String
            Select Case consumerKind
                Case MASSurfaceTreatmentConsumerKind.PanelShellSurface
                    Return "PanelShell material key resolution now flows through the treatment resolver while the existing frame painter path remains unchanged."
                Case MASSurfaceTreatmentConsumerKind.ApplicationChromeSurface
                    Return "Application chrome SurfaceVisualStyle material resolution now flows through the treatment resolver without changing shell rendering."
                Case MASSurfaceTreatmentConsumerKind.ProgressSurface
                    Return "Progress container material-key resolution now flows through the treatment resolver; progress-specific container chrome is not repainted in this pass."
                Case Else
                    Return MASSurfaceTreatmentConsumerCatalog.ConsumerDisplayName(consumerKind) & " is catalog-owned but not currently enabled for low-risk runtime alignment."
            End Select
        End Function

    End Class

End Namespace
