Option Strict On
Option Explicit On

Imports System

Namespace Nexamas.UI.Rendering

    ''' <summary>
    ''' Evidence row proving whether a consumer is allowed to use the low-risk runtime surface visual route.
    ''' </summary>
    Friend NotInheritable Class MASSurfaceTreatmentRuntimeAlignmentEntry

        Friend ReadOnly Property ConsumerKind As MASSurfaceTreatmentConsumerKind
        Friend ReadOnly Property ConsumerName As String
        Friend ReadOnly Property Status As MASSurfaceTreatmentRuntimeAlignmentStatus
        Friend ReadOnly Property ResolvedMaterialKey As String
        Friend ReadOnly Property ResolvedFrameKey As String
        Friend ReadOnly Property ResolvedFrameStrength As MASSurfaceFrameStrength
        Friend ReadOnly Property ThemeInfluenceMode As MASSurfaceTreatmentThemeInfluenceMode
        Friend ReadOnly Property UsesRuntimeResolver As Boolean
        Friend ReadOnly Property PreservesDefaultVisual As Boolean
        Friend ReadOnly Property AlignsMaterialOnly As Boolean
        Friend ReadOnly Property DefersFrameRepaint As Boolean
        Friend ReadOnly Property BlocksHighRiskMigration As Boolean
        Friend ReadOnly Property Notes As String

        Friend Sub New(consumerKind As MASSurfaceTreatmentConsumerKind,
                       consumerName As String,
                       status As MASSurfaceTreatmentRuntimeAlignmentStatus,
                       resolvedMaterialKey As String,
                       resolvedFrameKey As String,
                       resolvedFrameStrength As MASSurfaceFrameStrength,
                       themeInfluenceMode As MASSurfaceTreatmentThemeInfluenceMode,
                       usesRuntimeResolver As Boolean,
                       preservesDefaultVisual As Boolean,
                       alignsMaterialOnly As Boolean,
                       defersFrameRepaint As Boolean,
                       blocksHighRiskMigration As Boolean,
                       notes As String)

            Me.ConsumerKind = consumerKind
            Me.ConsumerName = Normalize(consumerName, consumerKind.ToString())
            Me.Status = status
            Me.ResolvedMaterialKey = Normalize(resolvedMaterialKey, MASSurfaceMaterialIds.PlatformDefault)
            Me.ResolvedFrameKey = Normalize(resolvedFrameKey, MASSurfaceFrameIds.PlatformDefault)
            Me.ResolvedFrameStrength = NormalizeStrength(resolvedFrameStrength)
            Me.ThemeInfluenceMode = If(themeInfluenceMode = MASSurfaceTreatmentThemeInfluenceMode.Unknown,
                                       MASSurfaceTreatmentThemeInfluenceMode.ThemeBound,
                                       themeInfluenceMode)
            Me.UsesRuntimeResolver = usesRuntimeResolver
            Me.PreservesDefaultVisual = preservesDefaultVisual
            Me.AlignsMaterialOnly = alignsMaterialOnly
            Me.DefersFrameRepaint = defersFrameRepaint
            Me.BlocksHighRiskMigration = blocksHighRiskMigration
            Me.Notes = Normalize(notes, String.Empty)
        End Sub

        Friend ReadOnly Property IsAligned As Boolean
            Get
                Return Status = MASSurfaceTreatmentRuntimeAlignmentStatus.AlignedLowRiskRuntimeSurfaceVisualRoute AndAlso
                       UsesRuntimeResolver AndAlso
                       PreservesDefaultVisual AndAlso
                       AlignsMaterialOnly AndAlso
                       DefersFrameRepaint AndAlso
                       Not BlocksHighRiskMigration
            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
