Option Strict On
Option Explicit On

Namespace Nexamas.UI.Rendering

    ''' <summary>
    ''' One generic slot-to-material assignment inside a surface material profile. It references
    ''' official material ids only and never stores element names.
    ''' </summary>
    Friend NotInheritable Class MASSurfaceMaterialSlotAssignment

        Friend Sub New(slot As MASSurfaceSlot,
                       materialKey As String,
                       Optional frameKey As String = Nothing,
                       Optional frameStrength As MASSurfaceFrameStrength = MASSurfaceFrameStrength.Level3,
                       Optional surfaceStrengthLevel As Integer = 4)
            Me.Slot = MASSurfaceSlotCatalog.Normalize(slot)
            Me.MaterialKey = MASSurfaceTreatmentMaterialKeyNormalizer.NormalizeForStorage(materialKey)
            Me.FrameKey = Normalize(frameKey)
            Me.FrameStrength = NormalizeFrameStrength(frameStrength)
            Me.SurfaceStrengthLevel = ClampLevel(surfaceStrengthLevel)
        End Sub

        Friend ReadOnly Property Slot As MASSurfaceSlot
        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 HasExplicitFrame As Boolean
            Get
                Return FrameKey.Length > 0
            End Get
        End Property

        Private Shared Function Normalize(value As String) As String
            Return If(value, String.Empty).Trim()
        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
