Option Strict On
Option Explicit On

Imports System

Namespace Nexamas.UI.Rendering

    ''' <summary>
    ''' Friend-only VisualSurface policy resolver for surface-treatment consumption.
    ''' It resolves material, recommended frame, strength, and theme influence from the
    ''' policy/catalog root. It does not read Governance evidence builders, draw, allocate
    ''' controls, run RenderVerification, or mutate any consumer.
    ''' </summary>
    Friend NotInheritable Class MASSurfaceTreatmentResolver

        Private Sub New()
        End Sub

        Friend Shared Function ResolveDefault(consumerKind As MASSurfaceTreatmentConsumerKind) As MASSurfaceTreatmentResolution
            Return Resolve(MASSurfaceTreatmentResolutionRequest.CreateDefault(consumerKind))
        End Function

        Friend Shared Function ResolveDefault(consumerKind As MASSurfaceTreatmentConsumerKind,
                                              frameStrength As MASSurfaceFrameStrength) As MASSurfaceTreatmentResolution
            Return Resolve(MASSurfaceTreatmentResolutionRequest.CreateDefault(consumerKind, frameStrength))
        End Function

        Friend Shared Function ResolveMaterialOverride(consumerKind As MASSurfaceTreatmentConsumerKind,
                                                       materialKey As String,
                                                       frameStrength As MASSurfaceFrameStrength) As MASSurfaceTreatmentResolution
            Return Resolve(MASSurfaceTreatmentResolutionRequest.CreateMaterialOverride(consumerKind, materialKey, frameStrength))
        End Function

        Friend Shared Function ResolveMaterialAndFrameOverride(consumerKind As MASSurfaceTreatmentConsumerKind,
                                                               materialKey As String,
                                                               frameKey As String,
                                                               frameStrength As MASSurfaceFrameStrength) As MASSurfaceTreatmentResolution
            Return Resolve(MASSurfaceTreatmentResolutionRequest.CreateMaterialAndFrameOverride(consumerKind, materialKey, frameKey, frameStrength))
        End Function

        Friend Shared Function Resolve(request As MASSurfaceTreatmentResolutionRequest) As MASSurfaceTreatmentResolution
            Dim safeRequest As MASSurfaceTreatmentResolutionRequest = If(request, MASSurfaceTreatmentResolutionRequest.CreateDefault(MASSurfaceTreatmentConsumerKind.Unknown))

            If Not IsCurrentOwnedSurfaceConsumer(safeRequest.ConsumerKind) Then
                Return CreateBlockedResolution(
                    consumerKind:=safeRequest.ConsumerKind,
                    consumerName:="Unknown surface treatment consumer",
                    request:=safeRequest,
                    status:=MASSurfaceTreatmentCompatibilityStatus.BlockedByUnknownConsumer,
                    notes:="Unknown consumers may not bypass VisualSurface policy.")
            End If

            Dim candidateMaterialKey As String = ResolveCandidateMaterialKey(safeRequest)
            Dim profile As MASSurfaceTreatmentMaterialProfile = Nothing
            Dim materialFound As Boolean = MASSurfaceTreatmentMaterialProfileCatalog.TryResolve(candidateMaterialKey, profile)
            If profile Is Nothing Then profile = MASSurfaceTreatmentMaterialProfileCatalog.Resolve(MASSurfaceMaterialIds.PlatformDefault)

            Dim recommendedFrameKey As String = profile.RecommendedFrameKey
            Dim candidateFrameKey As String = If(safeRequest.HasExplicitFrameOverride, safeRequest.RequestedFrameKey, recommendedFrameKey)
            Dim frameMatchesRecommendation As Boolean = String.Equals(candidateFrameKey, recommendedFrameKey, StringComparison.OrdinalIgnoreCase)
            Dim frameIsKnownSurfaceFrame As Boolean = MASSurfaceFrameIds.IsKnownFrameKey(candidateFrameKey)

            If safeRequest.HasExplicitFrameOverride AndAlso Not frameIsKnownSurfaceFrame Then
                Return New MASSurfaceTreatmentResolution(
                    consumerKind:=safeRequest.ConsumerKind,
                    consumerName:=MASSurfaceTreatmentConsumerCatalog.ConsumerDisplayName(safeRequest.ConsumerKind),
                    requestedMaterialKey:=safeRequest.RequestedMaterialKey,
                    requestedFrameKey:=safeRequest.RequestedFrameKey,
                    resolvedMaterialKey:=profile.MaterialKey,
                    resolvedFrameKey:=recommendedFrameKey,
                    resolvedFrameStrength:=safeRequest.RequestedFrameStrength,
                    themeInfluenceMode:=profile.ThemeInfluenceMode,
                    compatibilityStatus:=MASSurfaceTreatmentCompatibilityStatus.BlockedByFrameOverrideMismatch,
                    hasExplicitMaterialOverride:=safeRequest.HasExplicitMaterialOverride,
                    hasExplicitFrameOverride:=safeRequest.HasExplicitFrameOverride,
                    usesRecommendedFrame:=True,
                    usedMaterialFallback:=Not materialFound,
                    preservesDefaultVisualWhenNoOverride:=False,
                    isReadyForCurrentRuntimeConsumption:=False,
                    requiresCurrentVisualCaptureBeforeRuntimeUse:=True,
                    notes:="Frame overrides must resolve through the existing VisualSurfaceFrame before runtime consumption.")
            End If

            Dim requiresCapture As Boolean = RequiresCurrentVisualCaptureBeforeRuntimeUse(safeRequest)
            Dim readyNow As Boolean = MASSurfaceTreatmentConsumerCatalog.IsRuntimeSurfaceVisualConsumer(safeRequest.ConsumerKind) AndAlso
                                      materialFound AndAlso
                                      Not requiresCapture AndAlso
                                      (Not safeRequest.HasExplicitFrameOverride OrElse frameIsKnownSurfaceFrame)
            Dim preservesDefault As Boolean = Not safeRequest.HasExplicitMaterialOverride AndAlso
                                             Not safeRequest.HasExplicitFrameOverride
            Dim status As MASSurfaceTreatmentCompatibilityStatus = DetermineStatus(safeRequest, materialFound, requiresCapture)

            Return New MASSurfaceTreatmentResolution(
                consumerKind:=safeRequest.ConsumerKind,
                consumerName:=MASSurfaceTreatmentConsumerCatalog.ConsumerDisplayName(safeRequest.ConsumerKind),
                requestedMaterialKey:=safeRequest.RequestedMaterialKey,
                requestedFrameKey:=safeRequest.RequestedFrameKey,
                resolvedMaterialKey:=profile.MaterialKey,
                resolvedFrameKey:=candidateFrameKey,
                resolvedFrameStrength:=safeRequest.RequestedFrameStrength,
                themeInfluenceMode:=profile.ThemeInfluenceMode,
                compatibilityStatus:=status,
                hasExplicitMaterialOverride:=safeRequest.HasExplicitMaterialOverride,
                hasExplicitFrameOverride:=safeRequest.HasExplicitFrameOverride,
                usesRecommendedFrame:=frameMatchesRecommendation,
                usedMaterialFallback:=Not materialFound,
                preservesDefaultVisualWhenNoOverride:=preservesDefault,
                isReadyForCurrentRuntimeConsumption:=readyNow,
                requiresCurrentVisualCaptureBeforeRuntimeUse:=requiresCapture,
                notes:=BuildResolutionNotes(safeRequest, materialFound, requiresCapture))
        End Function

        Private Shared Function CreateBlockedResolution(consumerKind As MASSurfaceTreatmentConsumerKind,
                                                        consumerName As String,
                                                        request As MASSurfaceTreatmentResolutionRequest,
                                                        status As MASSurfaceTreatmentCompatibilityStatus,
                                                        notes As String) As MASSurfaceTreatmentResolution
            Return New MASSurfaceTreatmentResolution(
                consumerKind:=consumerKind,
                consumerName:=consumerName,
                requestedMaterialKey:=request.RequestedMaterialKey,
                requestedFrameKey:=request.RequestedFrameKey,
                resolvedMaterialKey:=MASSurfaceMaterialIds.PlatformDefault,
                resolvedFrameKey:=MASSurfaceFrameIds.PlatformDefault,
                resolvedFrameStrength:=request.RequestedFrameStrength,
                themeInfluenceMode:=MASSurfaceTreatmentThemeInfluenceMode.ThemeBound,
                compatibilityStatus:=status,
                hasExplicitMaterialOverride:=request.HasExplicitMaterialOverride,
                hasExplicitFrameOverride:=request.HasExplicitFrameOverride,
                usesRecommendedFrame:=True,
                usedMaterialFallback:=True,
                preservesDefaultVisualWhenNoOverride:=False,
                isReadyForCurrentRuntimeConsumption:=False,
                requiresCurrentVisualCaptureBeforeRuntimeUse:=True,
                notes:=notes)
        End Function

        Private Shared Function DetermineStatus(request As MASSurfaceTreatmentResolutionRequest,
                                                materialFound As Boolean,
                                                requiresCapture As Boolean) As MASSurfaceTreatmentCompatibilityStatus
            If Not materialFound Then Return MASSurfaceTreatmentCompatibilityStatus.ResolvedWithMaterialFallback
            If request.HasExplicitMaterialOverride AndAlso requiresCapture Then Return MASSurfaceTreatmentCompatibilityStatus.ResolvedOverrideRequiresConsumerMigration
            If request.HasExplicitMaterialOverride Then Return MASSurfaceTreatmentCompatibilityStatus.ResolvedOverrideReady
            Return MASSurfaceTreatmentCompatibilityStatus.ResolvedDefaultPreservesCurrentVisual
        End Function

        Private Shared Function ResolveCandidateMaterialKey(request As MASSurfaceTreatmentResolutionRequest) As String
            If request.HasExplicitMaterialOverride Then Return request.RequestedMaterialKey
            Return MASSurfaceMaterialIds.PlatformDefault
        End Function

        Private Shared Function RequiresCurrentVisualCaptureBeforeRuntimeUse(request As MASSurfaceTreatmentResolutionRequest) As Boolean
            Return request.HasExplicitMaterialOverride AndAlso
                   Not MASSurfaceTreatmentConsumerCatalog.IsRuntimeSurfaceVisualConsumer(request.ConsumerKind)
        End Function

        Private Shared Function IsCurrentOwnedSurfaceConsumer(consumerKind As MASSurfaceTreatmentConsumerKind) As Boolean
            For Each candidate As MASSurfaceTreatmentConsumerKind In MASSurfaceTreatmentConsumerCatalog.CurrentOwnershipConsumers()
                If candidate = consumerKind Then Return True
            Next

            Return False
        End Function

        Private Shared Function BuildResolutionNotes(request As MASSurfaceTreatmentResolutionRequest,
                                                      materialFound As Boolean,
                                                      requiresCapture As Boolean) As String
            If Not materialFound Then Return "Unknown material keys fall back to PlatformDefault; no renderer path changes."
            If request.HasExplicitMaterialOverride AndAlso requiresCapture Then Return "Override is policy-resolved but blocked from runtime migration until the current visual appearance is captured and verified."
            If request.HasExplicitMaterialOverride Then Return "Override resolves through VisualSurface material-frame-theme policy and remains inside the official route."
            Return "Default resolution preserves the current visual shape; no consumer repaint path changes."
        End Function

    End Class

End Namespace
