Option Strict On
Option Explicit On

Namespace Nexamas.UI.Rendering

    ''' <summary>
    ''' Resolved route from a generic surface slot/profile request to the canonical material,
    ''' frame, role, and strength that the Surface runtime can consume.
    ''' </summary>
    Friend NotInheritable Class MASSurfaceMaterialSlotRoute

        Friend Sub New(profileId As String,
                       slot As MASSurfaceSlot,
                       role As MASSurfaceRole,
                       materialKey As String,
                       frameKey As String,
                       frameStrength As MASSurfaceFrameStrength,
                       surfaceStrengthLevel As Integer,
                       treatmentResolution As MASSurfaceTreatmentResolution,
                       usedProfileFallback As Boolean,
                       usedSlotFallback As Boolean)
            Me.ProfileId = Normalize(profileId, MASSurfaceMaterialProfileIds.PlatformDefault)
            Me.Slot = MASSurfaceSlotCatalog.Normalize(slot)
            Me.Role = role
            Me.MaterialKey = Normalize(materialKey, MASSurfaceMaterialIds.PlatformDefault)
            Me.FrameKey = Normalize(frameKey, MASSurfaceFrameIds.PlatformDefault)
            Me.FrameStrength = NormalizeFrameStrength(frameStrength)
            Me.SurfaceStrengthLevel = ClampLevel(surfaceStrengthLevel)
            Me.TreatmentResolution = treatmentResolution
            Me.UsedProfileFallback = usedProfileFallback
            Me.UsedSlotFallback = usedSlotFallback
        End Sub

        Friend ReadOnly Property ProfileId As String
        Friend ReadOnly Property Slot As MASSurfaceSlot
        Friend ReadOnly Property Role As MASSurfaceRole
        Friend ReadOnly Property MaterialKey As String
        Friend ReadOnly Property FrameKey As String
        Friend ReadOnly Property FrameStrength As MASSurfaceFrameStrength
        Friend ReadOnly Property SurfaceStrengthLevel As Integer
        Friend ReadOnly Property TreatmentResolution As MASSurfaceTreatmentResolution
        Friend ReadOnly Property UsedProfileFallback As Boolean
        Friend ReadOnly Property UsedSlotFallback As Boolean

        Friend ReadOnly Property IsRuntimeReady As Boolean
            Get
                Return TreatmentResolution IsNot Nothing AndAlso
                       (TreatmentResolution.IsCompatibleForCurrentRuntime OrElse
                        TreatmentResolution.IsReadyForCurrentRuntimeConsumption OrElse
                        TreatmentResolution.CompatibilityStatus = MASSurfaceTreatmentCompatibilityStatus.ResolvedWithMaterialFallback)
            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 NormalizeFrameStrength(value As MASSurfaceFrameStrength) As MASSurfaceFrameStrength
            If System.Enum.IsDefined(GetType(MASSurfaceFrameStrength), value) Then Return value
            Return MASSurfaceFrameStrength.Level3
        End Function

        Private Shared Function ClampLevel(value As Integer) As Integer
            If value < 1 Then Return 1
            If value > 6 Then Return 6
            Return value
        End Function

    End Class

End Namespace
