Option Strict On
Option Explicit On

Imports System
Imports System.Collections.Generic

Namespace Nexamas.UI.Rendering

    ''' <summary>
    ''' Reusable material distribution for generic surface slots. A profile lets a complex element
    ''' apply one named material personality to Root/Header/Body/Footer/etc. without inventing
    ''' element-specific material ids.
    ''' </summary>
    Friend NotInheritable Class MASSurfaceMaterialSlotProfile
        Private ReadOnly _assignments As New Dictionary(Of MASSurfaceSlot, MASSurfaceMaterialSlotAssignment)()

        Friend Sub New(id As String,
                       displayName As String,
                       assignments As IEnumerable(Of MASSurfaceMaterialSlotAssignment),
                       Optional notes As String = Nothing)
            Me.Id = NormalizeWithFallback(id, MASSurfaceMaterialProfileIds.PlatformDefault)
            Me.DisplayName = NormalizeWithFallback(displayName, Me.Id)
            Me.Notes = Normalize(notes)

            If assignments IsNot Nothing Then
                For Each assignment As MASSurfaceMaterialSlotAssignment In assignments
                    If assignment Is Nothing Then Continue For
                    If assignment.Slot = MASSurfaceSlot.Unknown Then Continue For
                    _assignments(assignment.Slot) = assignment
                Next
            End If
        End Sub

        Friend ReadOnly Property Id As String
        Friend ReadOnly Property DisplayName As String
        Friend ReadOnly Property Notes As String

        Friend Function TryGetAssignment(slot As MASSurfaceSlot,
                                         ByRef assignment As MASSurfaceMaterialSlotAssignment) As Boolean
            Dim safeSlot As MASSurfaceSlot = MASSurfaceSlotCatalog.Normalize(slot)
            If safeSlot <> MASSurfaceSlot.Unknown AndAlso _assignments.TryGetValue(safeSlot, assignment) Then Return True

            If safeSlot <> MASSurfaceSlot.Root AndAlso _assignments.TryGetValue(MASSurfaceSlot.Root, assignment) Then Return True
            If safeSlot <> MASSurfaceSlot.Body AndAlso _assignments.TryGetValue(MASSurfaceSlot.Body, assignment) Then Return True

            assignment = Nothing
            Return False
        End Function

        Friend Function Assignments() As MASSurfaceMaterialSlotAssignment()
            Dim result As New List(Of MASSurfaceMaterialSlotAssignment)()
            For Each assignment As MASSurfaceMaterialSlotAssignment In _assignments.Values
                If assignment IsNot Nothing Then result.Add(assignment)
            Next
            Return result.ToArray()
        End Function

        Friend ReadOnly Property AssignmentCount As Integer
            Get
                Return _assignments.Count
            End Get
        End Property

        Private Shared Function Normalize(value As String) As String
            Return If(value, String.Empty).Trim()
        End Function

        Private Shared Function NormalizeWithFallback(value As String, fallback As String) As String
            Dim normalized As String = Normalize(value)
            If normalized.Length = 0 Then Return fallback
            Return normalized
        End Function

    End Class

End Namespace
