Option Strict On
Option Explicit On

Imports System

Namespace Nexamas.UI.Rendering

    ''' <summary>
    ''' One current-visual capture record for a Surface Treatment consumer bucket.
    ''' The entry captures the current default treatment and migration boundary; it does not draw.
    ''' </summary>
    Friend NotInheritable Class MASSurfaceTreatmentCurrentVisualCaptureEntry

        Friend ReadOnly Property ConsumerKind As MASSurfaceTreatmentConsumerKind
        Friend ReadOnly Property ConsumerName As String
        Friend ReadOnly Property Status As MASSurfaceTreatmentCurrentVisualCaptureStatus
        Friend ReadOnly Property DefaultMaterialKey As String
        Friend ReadOnly Property DefaultFrameKey As String
        Friend ReadOnly Property DefaultFrameStrength As MASSurfaceFrameStrength
        Friend ReadOnly Property ThemeInfluenceMode As MASSurfaceTreatmentThemeInfluenceMode
        Friend ReadOnly Property CapturesCurrentDefault As Boolean
        Friend ReadOnly Property CapturesMaterialFramePairing As Boolean
        Friend ReadOnly Property CapturesAllFrameStrengthLevels As Boolean
        Friend ReadOnly Property IsLowRiskSurfaceVisualConsumer As Boolean
        Friend ReadOnly Property BlocksRuntimeRendererChange As Boolean
        Friend ReadOnly Property BlocksHighRiskMigration As Boolean
        Friend ReadOnly Property AllowsFutureOverrideThroughResolver As Boolean
        Friend ReadOnly Property Notes As String

        Friend Sub New(consumerKind As MASSurfaceTreatmentConsumerKind,
                       consumerName As String,
                       status As MASSurfaceTreatmentCurrentVisualCaptureStatus,
                       defaultMaterialKey As String,
                       defaultFrameKey As String,
                       defaultFrameStrength As MASSurfaceFrameStrength,
                       themeInfluenceMode As MASSurfaceTreatmentThemeInfluenceMode,
                       capturesCurrentDefault As Boolean,
                       capturesMaterialFramePairing As Boolean,
                       capturesAllFrameStrengthLevels As Boolean,
                       isLowRiskSurfaceVisualConsumer As Boolean,
                       blocksRuntimeRendererChange As Boolean,
                       blocksHighRiskMigration As Boolean,
                       allowsFutureOverrideThroughResolver As Boolean,
                       notes As String)

            Me.ConsumerKind = consumerKind
            Me.ConsumerName = Normalize(consumerName, consumerKind.ToString())
            Me.Status = status
            Me.DefaultMaterialKey = Normalize(defaultMaterialKey, MASSurfaceMaterialIds.PlatformDefault)
            Me.DefaultFrameKey = Normalize(defaultFrameKey, MASSurfaceFrameIds.PlatformDefault)
            Me.DefaultFrameStrength = NormalizeStrength(defaultFrameStrength)
            Me.ThemeInfluenceMode = If(themeInfluenceMode = MASSurfaceTreatmentThemeInfluenceMode.Unknown,
                                       MASSurfaceTreatmentThemeInfluenceMode.ThemeBound,
                                       themeInfluenceMode)
            Me.CapturesCurrentDefault = capturesCurrentDefault
            Me.CapturesMaterialFramePairing = capturesMaterialFramePairing
            Me.CapturesAllFrameStrengthLevels = capturesAllFrameStrengthLevels
            Me.IsLowRiskSurfaceVisualConsumer = isLowRiskSurfaceVisualConsumer
            Me.BlocksRuntimeRendererChange = blocksRuntimeRendererChange
            Me.BlocksHighRiskMigration = blocksHighRiskMigration
            Me.AllowsFutureOverrideThroughResolver = allowsFutureOverrideThroughResolver
            Me.Notes = Normalize(notes, String.Empty)
        End Sub

        Friend ReadOnly Property IsCaptured As Boolean
            Get
                Return Status = MASSurfaceTreatmentCurrentVisualCaptureStatus.CapturedLowRiskSurfaceVisualDefault OrElse
                       Status = MASSurfaceTreatmentCurrentVisualCaptureStatus.CapturedLowRiskSurfaceVisualDefaultWithFrameStrengthCoverage
            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
