Option Strict On
Option Explicit On

Imports System
Imports System.Collections.Generic

Namespace Nexamas.UI.Rendering

    ''' <summary>
    ''' Builds the governance plan for later proving material-specific frames at runtime.
    ''' The builder consumes existing evidence reports only and does not create controls, render, or change frame output.
    ''' </summary>
    Friend NotInheritable Class MASSurfaceTreatmentFrameRuntimeProofPlanningBuilder

        Private Sub New()
        End Sub

        Friend Shared Function BuildFrameRuntimeProofPlanning() As MASSurfaceTreatmentFrameRuntimeProofPlanningReport
            Dim runtimeAlignment As MASSurfaceTreatmentRuntimeAlignmentReport = MASSurfaceTreatmentRuntimeAlignmentBuilder.BuildLowRiskRuntimeAlignment()
            Dim framePairing As MASSurfaceTreatmentFramePairingReport = MASSurfaceTreatmentFramePairingPlanner.BuildLowRiskMaterialFramePairingPlan()
            Dim entries As New List(Of MASSurfaceTreatmentFrameRuntimeProofPlanningEntry)()

            For Each consumerKind As MASSurfaceTreatmentConsumerKind In MASSurfaceTreatmentConsumerCatalog.FrameRuntimeProofConsumers()
                AddLowRiskConsumerPlans(entries,
                                        runtimeAlignment,
                                        framePairing,
                                        consumerKind,
                                        MASSurfaceTreatmentConsumerCatalog.DefaultLowRiskRuntimeFrameStrength(consumerKind))
            Next

            Return New MASSurfaceTreatmentFrameRuntimeProofPlanningReport(
                name:="Surface Treatment Frame Pairing Runtime Proof Planning",
                entries:=entries.ToArray(),
                framePairingReady:=framePairing IsNot Nothing AndAlso framePairing.ReadyForLowRiskFramePairingProof,
                runtimeAlignmentReady:=runtimeAlignment IsNot Nothing AndAlso runtimeAlignment.ReadyForLowRiskFramePairingPlanning)
        End Function

        Private Shared Sub AddLowRiskConsumerPlans(entries As List(Of MASSurfaceTreatmentFrameRuntimeProofPlanningEntry),
                                                   runtimeAlignment As MASSurfaceTreatmentRuntimeAlignmentReport,
                                                   framePairing As MASSurfaceTreatmentFramePairingReport,
                                                   consumerKind As MASSurfaceTreatmentConsumerKind,
                                                   frameStrength As MASSurfaceFrameStrength)
            If entries Is Nothing Then Return

            Dim runtimeEntry As MASSurfaceTreatmentRuntimeAlignmentEntry = FindRuntimeEntry(runtimeAlignment, consumerKind)
            Dim runtimeReady As Boolean = runtimeAlignment IsNot Nothing AndAlso
                                          runtimeAlignment.ReadyForLowRiskFramePairingPlanning AndAlso
                                          runtimeEntry IsNot Nothing AndAlso
                                          runtimeEntry.IsAligned
            Dim framePairingReady As Boolean = framePairing IsNot Nothing AndAlso framePairing.ReadyForLowRiskFramePairingProof
            Dim pairings As MASSurfaceTreatmentFramePairingEntry() = If(framePairing Is Nothing,
                                                                        New MASSurfaceTreatmentFramePairingEntry() {},
                                                                        framePairing.Entries)

            For Each pairing As MASSurfaceTreatmentFramePairingEntry In pairings
                If pairing IsNot Nothing Then
                    entries.Add(BuildLowRiskEntry(consumerKind, frameStrength, pairing, runtimeReady, framePairingReady))
                End If
            Next
        End Sub

        Private Shared Function BuildLowRiskEntry(consumerKind As MASSurfaceTreatmentConsumerKind,
                                                  frameStrength As MASSurfaceFrameStrength,
                                                  pairing As MASSurfaceTreatmentFramePairingEntry,
                                                  runtimeReady As Boolean,
                                                  framePairingReady As Boolean) As MASSurfaceTreatmentFrameRuntimeProofPlanningEntry
            Dim resolution As MASSurfaceTreatmentResolution = MASSurfaceTreatmentResolver.ResolveMaterialAndFrameOverride(
                consumerKind:=consumerKind,
                materialKey:=If(pairing Is Nothing, MASSurfaceMaterialIds.PlatformDefault, pairing.MaterialKey),
                frameKey:=If(pairing Is Nothing, MASSurfaceFrameIds.PlatformDefault, pairing.RecommendedFrameKey),
                frameStrength:=frameStrength)

            Dim frameKnown As Boolean = pairing IsNot Nothing AndAlso MASSurfaceFrameIds.IsKnownFrameKey(pairing.RecommendedFrameKey)
            Dim hasPairing As Boolean = pairing IsNot Nothing AndAlso pairing.IsPlannedPairing AndAlso frameKnown
            Dim status As MASSurfaceTreatmentFrameRuntimeProofPlanningStatus = DetermineLowRiskStatus(runtimeReady, framePairingReady, hasPairing, resolution)
            Dim canPlan As Boolean = status = MASSurfaceTreatmentFrameRuntimeProofPlanningStatus.PlannedLowRiskFrameRuntimeProof

            Return New MASSurfaceTreatmentFrameRuntimeProofPlanningEntry(
                consumerKind:=consumerKind,
                consumerName:=ResolveConsumerName(consumerKind),
                materialKey:=If(pairing Is Nothing, MASSurfaceMaterialIds.PlatformDefault, pairing.MaterialKey),
                plannedFrameKey:=If(pairing Is Nothing, MASSurfaceFrameIds.PlatformDefault, pairing.RecommendedFrameKey),
                plannedFrameStrength:=frameStrength,
                themeInfluenceMode:=If(pairing Is Nothing, MASSurfaceTreatmentThemeInfluenceMode.ThemeBound, pairing.ThemeInfluenceMode),
                status:=status,
                isCompatibilityAlias:=pairing IsNot Nothing AndAlso pairing.IsCompatibilityAlias,
                preservesMaterialIdentity:=pairing IsNot Nothing AndAlso pairing.PreservesMaterialIdentity,
                hasCurrentVisualCapture:=canPlan,
                hasRuntimeSurfaceVisualRoute:=canPlan,
                hasMaterialFramePairing:=hasPairing,
                usesOfficialSurfaceFrame:=frameKnown,
                keepsSingleFrameStrengthModel:=pairing IsNot Nothing AndAlso pairing.KeepsSingleFrameStrengthModel,
                defersRuntimeFrameRepaint:=True,
                requiresRenderVerificationBeforeRuntimeFrameUse:=False,
                notes:=BuildLowRiskNotes(consumerKind, pairing, status, resolution))
        End Function

        Private Shared Function DetermineLowRiskStatus(runtimeReady As Boolean,
                                                       framePairingReady As Boolean,
                                                       hasPairing As Boolean,
                                                       resolution As MASSurfaceTreatmentResolution) As MASSurfaceTreatmentFrameRuntimeProofPlanningStatus
            If Not framePairingReady OrElse Not hasPairing Then Return MASSurfaceTreatmentFrameRuntimeProofPlanningStatus.BlockedByFramePairingEvidence
            If Not runtimeReady Then Return MASSurfaceTreatmentFrameRuntimeProofPlanningStatus.BlockedByRuntimeAlignmentEvidence
            If resolution Is Nothing Then Return MASSurfaceTreatmentFrameRuntimeProofPlanningStatus.IncompleteEvidence
            If resolution.CompatibilityStatus = MASSurfaceTreatmentCompatibilityStatus.BlockedByFrameOverrideMismatch Then Return MASSurfaceTreatmentFrameRuntimeProofPlanningStatus.BlockedByFrameOverrideMismatch
            If Not resolution.IsReadyForCurrentRuntimeConsumption Then Return MASSurfaceTreatmentFrameRuntimeProofPlanningStatus.BlockedByRuntimeAlignmentEvidence
            Return MASSurfaceTreatmentFrameRuntimeProofPlanningStatus.PlannedLowRiskFrameRuntimeProof
        End Function
        Private Shared Function FindRuntimeEntry(runtimeAlignment As MASSurfaceTreatmentRuntimeAlignmentReport,
                                                 consumerKind As MASSurfaceTreatmentConsumerKind) As MASSurfaceTreatmentRuntimeAlignmentEntry
            If runtimeAlignment Is Nothing Then Return Nothing

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

            Return Nothing
        End Function

        Private Shared Function BuildLowRiskNotes(consumerKind As MASSurfaceTreatmentConsumerKind,
                                                  pairing As MASSurfaceTreatmentFramePairingEntry,
                                                  status As MASSurfaceTreatmentFrameRuntimeProofPlanningStatus,
                                                  resolution As MASSurfaceTreatmentResolution) As String
            If status <> MASSurfaceTreatmentFrameRuntimeProofPlanningStatus.PlannedLowRiskFrameRuntimeProof Then
                Return "Frame runtime proof planning is blocked until prior Surface Treatment evidence is complete."
            End If

            Dim materialKey As String = If(pairing Is Nothing, MASSurfaceMaterialIds.PlatformDefault, pairing.MaterialKey)
            Dim frameKey As String = If(pairing Is Nothing, MASSurfaceFrameIds.PlatformDefault, pairing.RecommendedFrameKey)
            Dim compatibility As String = If(resolution Is Nothing, MASSurfaceTreatmentCompatibilityStatus.Unknown.ToString(), resolution.CompatibilityStatus.ToString())

            Return ResolveConsumerName(consumerKind) & " can later prove material '" & materialKey & "' with frame '" & frameKey & "' through the existing treatment resolver; runtime frame repaint remains deferred. Compatibility: " & compatibility & "."
        End Function

        Private Shared Function ResolveConsumerName(consumerKind As MASSurfaceTreatmentConsumerKind) As String
            Return MASSurfaceTreatmentConsumerCatalog.ConsumerDisplayName(consumerKind)
        End Function

    End Class

End Namespace
