Option Strict On
Option Explicit On

Imports System

Namespace Nexamas.UI.Rendering

    ''' <summary>
    ''' Evidence row for a future frame-runtime proof plan.
    ''' It combines a consumer slot, a material profile, and an existing VisualSurfaceFrame frame id
    ''' while explicitly keeping runtime frame repaint deferred.
    ''' </summary>
    Friend NotInheritable Class MASSurfaceTreatmentFrameRuntimeProofPlanningEntry

        Friend ReadOnly Property ConsumerKind As MASSurfaceTreatmentConsumerKind
        Friend ReadOnly Property ConsumerName As String
        Friend ReadOnly Property MaterialKey As String
        Friend ReadOnly Property PlannedFrameKey As String
        Friend ReadOnly Property PlannedFrameStrength As MASSurfaceFrameStrength
        Friend ReadOnly Property ThemeInfluenceMode As MASSurfaceTreatmentThemeInfluenceMode
        Friend ReadOnly Property Status As MASSurfaceTreatmentFrameRuntimeProofPlanningStatus
        Friend ReadOnly Property IsCompatibilityAlias As Boolean
        Friend ReadOnly Property PreservesMaterialIdentity As Boolean
        Friend ReadOnly Property HasCurrentVisualCapture As Boolean
        Friend ReadOnly Property HasRuntimeSurfaceVisualRoute As Boolean
        Friend ReadOnly Property HasMaterialFramePairing As Boolean
        Friend ReadOnly Property UsesOfficialSurfaceFrame As Boolean
        Friend ReadOnly Property KeepsSingleFrameStrengthModel As Boolean
        Friend ReadOnly Property DefersRuntimeFrameRepaint As Boolean
        Friend ReadOnly Property RequiresRenderVerificationBeforeRuntimeFrameUse As Boolean
        Friend ReadOnly Property Notes As String

        Friend Sub New(consumerKind As MASSurfaceTreatmentConsumerKind,
                       consumerName As String,
                       materialKey As String,
                       plannedFrameKey As String,
                       plannedFrameStrength As MASSurfaceFrameStrength,
                       themeInfluenceMode As MASSurfaceTreatmentThemeInfluenceMode,
                       status As MASSurfaceTreatmentFrameRuntimeProofPlanningStatus,
                       isCompatibilityAlias As Boolean,
                       preservesMaterialIdentity As Boolean,
                       hasCurrentVisualCapture As Boolean,
                       hasRuntimeSurfaceVisualRoute As Boolean,
                       hasMaterialFramePairing As Boolean,
                       usesOfficialSurfaceFrame As Boolean,
                       keepsSingleFrameStrengthModel As Boolean,
                       defersRuntimeFrameRepaint As Boolean,
                       requiresRenderVerificationBeforeRuntimeFrameUse As Boolean,
                       notes As String)

            Me.ConsumerKind = consumerKind
            Me.ConsumerName = Normalize(consumerName, consumerKind.ToString())
            Me.MaterialKey = Normalize(materialKey, MASSurfaceMaterialIds.PlatformDefault)
            Me.PlannedFrameKey = Normalize(plannedFrameKey, MASSurfaceFrameIds.PlatformDefault)
            Me.PlannedFrameStrength = NormalizeStrength(plannedFrameStrength)
            Me.ThemeInfluenceMode = If(themeInfluenceMode = MASSurfaceTreatmentThemeInfluenceMode.Unknown,
                                       MASSurfaceTreatmentThemeInfluenceMode.ThemeBound,
                                       themeInfluenceMode)
            Me.Status = status
            Me.IsCompatibilityAlias = isCompatibilityAlias
            Me.PreservesMaterialIdentity = preservesMaterialIdentity
            Me.HasCurrentVisualCapture = hasCurrentVisualCapture
            Me.HasRuntimeSurfaceVisualRoute = hasRuntimeSurfaceVisualRoute
            Me.HasMaterialFramePairing = hasMaterialFramePairing
            Me.UsesOfficialSurfaceFrame = usesOfficialSurfaceFrame
            Me.KeepsSingleFrameStrengthModel = keepsSingleFrameStrengthModel
            Me.DefersRuntimeFrameRepaint = defersRuntimeFrameRepaint
            Me.RequiresRenderVerificationBeforeRuntimeFrameUse = requiresRenderVerificationBeforeRuntimeFrameUse
            Me.Notes = Normalize(notes, String.Empty)
        End Sub

        Friend ReadOnly Property IsLowRiskProofPlanned As Boolean
            Get
                Return Status = MASSurfaceTreatmentFrameRuntimeProofPlanningStatus.PlannedLowRiskFrameRuntimeProof AndAlso
                       HasCurrentVisualCapture AndAlso
                       HasRuntimeSurfaceVisualRoute AndAlso
                       HasMaterialFramePairing AndAlso
                       UsesOfficialSurfaceFrame AndAlso
                       KeepsSingleFrameStrengthModel AndAlso
                       DefersRuntimeFrameRepaint AndAlso
                       Not RequiresRenderVerificationBeforeRuntimeFrameUse
            End Get
        End Property

        Friend ReadOnly Property IsInteractiveControlBlocked As Boolean
            Get
                Return False
            End Get
        End Property

        Friend ReadOnly Property UsesMaterialSpecificFrame As Boolean
            Get
                Return IsLowRiskProofPlanned AndAlso
                       Not IsCompatibilityAlias AndAlso
                       Not String.Equals(PlannedFrameKey, MASSurfaceFrameIds.PlatformDefault, StringComparison.OrdinalIgnoreCase)
            End Get
        End Property

        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

        Private Shared Function NormalizeStrength(value As MASSurfaceFrameStrength) As MASSurfaceFrameStrength
            If [Enum].IsDefined(GetType(MASSurfaceFrameStrength), value) Then Return value
            Return MASSurfaceFrameStrength.Level3
        End Function

    End Class

End Namespace
