Option Strict On
Option Explicit On

Imports System
Imports System.Collections.Generic

Namespace Nexamas.UI.Rendering

    ''' <summary>
    ''' Canonical registry for generic surface material slot profiles. It is intentionally separate
    ''' from element controls: profiles describe material distribution, not component identity.
    ''' </summary>
    Friend NotInheritable Class MASSurfaceMaterialSlotProfileRegistry
        Private Shared ReadOnly _sync As New Object()
        Private Shared ReadOnly _profiles As New Dictionary(Of String, MASSurfaceMaterialSlotProfile)(StringComparer.OrdinalIgnoreCase)
        Private Shared ReadOnly _aliases As New Dictionary(Of String, String)(StringComparer.OrdinalIgnoreCase)
        Private Shared _initialized As Boolean

        Private Sub New()
        End Sub

        Friend Shared Sub Register(profile As MASSurfaceMaterialSlotProfile)
            If profile Is Nothing Then Throw New ArgumentNullException(NameOf(profile))

            SyncLock _sync
                EnsureDefaultsNoLock()
                _profiles(profile.Id) = profile
            End SyncLock
        End Sub

        Friend Shared Function Resolve(profileId As String) As MASSurfaceMaterialSlotProfile
            SyncLock _sync
                EnsureDefaultsNoLock()

                Dim safeId As String = CanonicalizeNoLock(profileId)
                Dim profile As MASSurfaceMaterialSlotProfile = Nothing
                If _profiles.TryGetValue(safeId, profile) Then Return profile

                Return _profiles(MASSurfaceMaterialProfileIds.PlatformDefault)
            End SyncLock
        End Function

        Friend Shared Function TryResolve(profileId As String,
                                          ByRef profile As MASSurfaceMaterialSlotProfile) As Boolean
            SyncLock _sync
                EnsureDefaultsNoLock()

                Dim safeId As String = CanonicalizeNoLock(profileId)
                If _profiles.TryGetValue(safeId, profile) Then Return True

                profile = Nothing
                Return False
            End SyncLock
        End Function

        Friend Shared Function RegisteredProfiles() As MASSurfaceMaterialSlotProfile()
            SyncLock _sync
                EnsureDefaultsNoLock()

                Dim result As New List(Of MASSurfaceMaterialSlotProfile)()
                For Each profile As MASSurfaceMaterialSlotProfile In _profiles.Values
                    If profile IsNot Nothing Then result.Add(profile)
                Next

                Return result.ToArray()
            End SyncLock
        End Function

        Friend Shared Function Canonicalize(profileId As String) As String
            SyncLock _sync
                EnsureDefaultsNoLock()
                Return CanonicalizeNoLock(profileId)
            End SyncLock
        End Function

        Friend Shared Function IsCompatibilityAlias(profileId As String) As Boolean
            SyncLock _sync
                EnsureDefaultsNoLock()
                Dim safeId As String = Normalize(profileId)
                If safeId.Length = 0 Then Return False
                Return _aliases.ContainsKey(safeId)
            End SyncLock
        End Function

        Private Shared Function CanonicalizeNoLock(profileId As String) As String
            Dim safeId As String = Normalize(profileId)
            If safeId.Length = 0 OrElse String.Equals(safeId, MASSurfaceMaterialProfileIds.Auto, StringComparison.OrdinalIgnoreCase) Then
                Return MASSurfaceMaterialProfileIds.PlatformDefault
            End If

            Dim compact As String = safeId.Replace("_", String.Empty).Replace("-", String.Empty).Replace(".", String.Empty).Replace(" ", String.Empty).ToLowerInvariant()
            Select Case compact
                Case "default", "platform", "platformdefault", "materialprofiledefault", "surfacematerialprofileplatformdefault"
                    Return MASSurfaceMaterialProfileIds.PlatformDefault
                Case "glass", "premiumglass", "glassy", "glassypremium", "materialprofilepremiumglass", "surfacematerialprofilepremiumglass"
                    Return MASSurfaceMaterialProfileIds.PremiumGlass
                Case "crystal", "nativecrystal", "crystalnative", "crystalice", "crystalicenative", "identitycrystal", "materialprofilecrystalnative", "surfacematerialprofilecrystalnative"
                    Return MASSurfaceMaterialProfileIds.CrystalNative
                Case "paper", "warmpaper", "nativepaper", "warmpapernative", "identitypaper", "materialprofilewarmpapernative", "surfacematerialprofilewarmpapernative"
                    Return MASSurfaceMaterialProfileIds.WarmPaperNative
                Case "graphite", "metal", "graphitechrome", "metalchrome", "materialprofilegraphitechrome", "surfacematerialprofilegraphitechrome"
                    Return MASSurfaceMaterialProfileIds.GraphiteChrome
                Case "media", "mediasurface", "mediachrome", "mediastage", "materialprofilemediasurface", "surfacematerialprofilemediasurface"
                    Return MASSurfaceMaterialProfileIds.MediaSurface
            End Select

            Dim canonical As String = Nothing
            If _aliases.TryGetValue(safeId, canonical) Then Return canonical
            Return safeId
        End Function

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

        Private Shared Sub EnsureDefaultsNoLock()
            If _initialized Then Return

            AddProfileNoLock(CreatePlatformDefaultProfile())
            AddProfileNoLock(CreatePremiumGlassProfile())
            AddProfileNoLock(CreateCrystalNativeProfile())
            AddProfileNoLock(CreateWarmPaperNativeProfile())
            AddProfileNoLock(CreateGraphiteChromeProfile())
            AddProfileNoLock(CreateMediaSurfaceProfile())

            AddAliasNoLock("material-profile.default", MASSurfaceMaterialProfileIds.PlatformDefault)
            AddAliasNoLock("material-profile.premium-glass", MASSurfaceMaterialProfileIds.PremiumGlass)
            AddAliasNoLock("material-profile.crystal-native", MASSurfaceMaterialProfileIds.CrystalNative)
            AddAliasNoLock("material-profile.warm-paper-native", MASSurfaceMaterialProfileIds.WarmPaperNative)
            AddAliasNoLock("material-profile.graphite-chrome", MASSurfaceMaterialProfileIds.GraphiteChrome)
            AddAliasNoLock("material-profile.media-surface", MASSurfaceMaterialProfileIds.MediaSurface)

            _initialized = True
        End Sub

        Private Shared Sub AddProfileNoLock(profile As MASSurfaceMaterialSlotProfile)
            If profile Is Nothing Then Return
            _profiles(profile.Id) = profile
        End Sub

        Private Shared Sub AddAliasNoLock(aliasId As String,
                                          canonicalId As String)
            Dim safeAlias As String = Normalize(aliasId)
            Dim safeCanonical As String = Normalize(canonicalId)
            If safeAlias.Length = 0 OrElse safeCanonical.Length = 0 Then Return
            If String.Equals(safeAlias, safeCanonical, StringComparison.OrdinalIgnoreCase) Then Return
            _aliases(safeAlias) = safeCanonical
        End Sub

        Private Shared Function CreatePlatformDefaultProfile() As MASSurfaceMaterialSlotProfile
            Return New MASSurfaceMaterialSlotProfile(
                id:=MASSurfaceMaterialProfileIds.PlatformDefault,
                displayName:="Platform Default",
                assignments:=New MASSurfaceMaterialSlotAssignment() {
                    New MASSurfaceMaterialSlotAssignment(MASSurfaceSlot.Root, MASSurfaceMaterialIds.PlatformDefault, MASSurfaceFrameIds.PlatformDefault, MASSurfaceFrameStrength.Level3, 4),
                    New MASSurfaceMaterialSlotAssignment(MASSurfaceSlot.Header, MASSurfaceMaterialIds.PlatformDefault, MASSurfaceFrameIds.PlatformDefault, MASSurfaceFrameStrength.Level3, 4),
                    New MASSurfaceMaterialSlotAssignment(MASSurfaceSlot.Body, MASSurfaceMaterialIds.PlatformDefault, MASSurfaceFrameIds.PlatformDefault, MASSurfaceFrameStrength.Level3, 4),
                    New MASSurfaceMaterialSlotAssignment(MASSurfaceSlot.Footer, MASSurfaceMaterialIds.PlatformDefault, MASSurfaceFrameIds.PlatformDefault, MASSurfaceFrameStrength.Level3, 4)
                },
                notes:="Default profile that preserves current visuals when no material personality is selected.")
        End Function

        Private Shared Function CreatePremiumGlassProfile() As MASSurfaceMaterialSlotProfile
            Return New MASSurfaceMaterialSlotProfile(
                id:=MASSurfaceMaterialProfileIds.PremiumGlass,
                displayName:="Premium Glass",
                assignments:=New MASSurfaceMaterialSlotAssignment() {
                    New MASSurfaceMaterialSlotAssignment(MASSurfaceSlot.Root, MASSurfaceMaterialIds.SoftMist, MASSurfaceFrameIds.SoftMist, MASSurfaceFrameStrength.Level3, 4),
                    New MASSurfaceMaterialSlotAssignment(MASSurfaceSlot.Header, MASSurfaceMaterialIds.FrostedGlass, MASSurfaceFrameIds.FrostedGlass, MASSurfaceFrameStrength.Level4, 5),
                    New MASSurfaceMaterialSlotAssignment(MASSurfaceSlot.Toolbar, MASSurfaceMaterialIds.CrystalIce, MASSurfaceFrameIds.CrystalIce, MASSurfaceFrameStrength.Level4, 5),
                    New MASSurfaceMaterialSlotAssignment(MASSurfaceSlot.Body, MASSurfaceMaterialIds.PlatformDefault, MASSurfaceFrameIds.PlatformDefault, MASSurfaceFrameStrength.Level3, 4),
                    New MASSurfaceMaterialSlotAssignment(MASSurfaceSlot.Overlay, MASSurfaceMaterialIds.FrostedGlass, MASSurfaceFrameIds.FrostedGlass, MASSurfaceFrameStrength.Level4, 5),
                    New MASSurfaceMaterialSlotAssignment(MASSurfaceSlot.Footer, MASSurfaceMaterialIds.SoftMist, MASSurfaceFrameIds.SoftMist, MASSurfaceFrameStrength.Level3, 4)
                },
                notes:="Reusable glass distribution for premium surfaces with a soft body and stronger chrome.")
        End Function

        Private Shared Function CreateCrystalNativeProfile() As MASSurfaceMaterialSlotProfile
            Return New MASSurfaceMaterialSlotProfile(
                id:=MASSurfaceMaterialProfileIds.CrystalNative,
                displayName:="Crystal Native",
                assignments:=New MASSurfaceMaterialSlotAssignment() {
                    New MASSurfaceMaterialSlotAssignment(MASSurfaceSlot.Root, MASSurfaceMaterialIds.CrystalIceNative, MASSurfaceFrameIds.CrystalIce, MASSurfaceFrameStrength.Level4, 5),
                    New MASSurfaceMaterialSlotAssignment(MASSurfaceSlot.Header, MASSurfaceMaterialIds.CrystalIceNative, MASSurfaceFrameIds.CrystalIce, MASSurfaceFrameStrength.Level4, 5),
                    New MASSurfaceMaterialSlotAssignment(MASSurfaceSlot.Toolbar, MASSurfaceMaterialIds.CrystalIceNative, MASSurfaceFrameIds.CrystalIce, MASSurfaceFrameStrength.Level4, 5),
                    New MASSurfaceMaterialSlotAssignment(MASSurfaceSlot.Body, MASSurfaceMaterialIds.CrystalIceNative, MASSurfaceFrameIds.CrystalIce, MASSurfaceFrameStrength.Level3, 4),
                    New MASSurfaceMaterialSlotAssignment(MASSurfaceSlot.Overlay, MASSurfaceMaterialIds.CrystalIceNative, MASSurfaceFrameIds.CrystalIce, MASSurfaceFrameStrength.Level5, 6)
                },
                notes:="Identity-preserving Crystal Ice profile for testing or seeding a future crystal-driven theme.")
        End Function

        Private Shared Function CreateWarmPaperNativeProfile() As MASSurfaceMaterialSlotProfile
            Return New MASSurfaceMaterialSlotProfile(
                id:=MASSurfaceMaterialProfileIds.WarmPaperNative,
                displayName:="Warm Paper Native",
                assignments:=New MASSurfaceMaterialSlotAssignment() {
                    New MASSurfaceMaterialSlotAssignment(MASSurfaceSlot.Root, MASSurfaceMaterialIds.WarmPaperNative, MASSurfaceFrameIds.WarmPaper, MASSurfaceFrameStrength.Level3, 4),
                    New MASSurfaceMaterialSlotAssignment(MASSurfaceSlot.Header, MASSurfaceMaterialIds.WarmPaperNative, MASSurfaceFrameIds.WarmPaper, MASSurfaceFrameStrength.Level3, 4),
                    New MASSurfaceMaterialSlotAssignment(MASSurfaceSlot.Body, MASSurfaceMaterialIds.WarmPaperNative, MASSurfaceFrameIds.WarmPaper, MASSurfaceFrameStrength.Level2, 3),
                    New MASSurfaceMaterialSlotAssignment(MASSurfaceSlot.Footer, MASSurfaceMaterialIds.WarmPaperNative, MASSurfaceFrameIds.WarmPaper, MASSurfaceFrameStrength.Level3, 4),
                    New MASSurfaceMaterialSlotAssignment(MASSurfaceSlot.Viewport, MASSurfaceMaterialIds.WarmPaperNative, MASSurfaceFrameIds.WarmPaper, MASSurfaceFrameStrength.Level2, 3)
                },
                notes:="Identity-preserving warm paper distribution for readable, paper-led surfaces.")
        End Function

        Private Shared Function CreateGraphiteChromeProfile() As MASSurfaceMaterialSlotProfile
            Return New MASSurfaceMaterialSlotProfile(
                id:=MASSurfaceMaterialProfileIds.GraphiteChrome,
                displayName:="Graphite Chrome",
                assignments:=New MASSurfaceMaterialSlotAssignment() {
                    New MASSurfaceMaterialSlotAssignment(MASSurfaceSlot.Root, MASSurfaceMaterialIds.PlatformDefault, MASSurfaceFrameIds.PlatformDefault, MASSurfaceFrameStrength.Level3, 4),
                    New MASSurfaceMaterialSlotAssignment(MASSurfaceSlot.Header, MASSurfaceMaterialIds.GraphiteMetal, MASSurfaceFrameIds.GraphiteMetal, MASSurfaceFrameStrength.Level4, 5),
                    New MASSurfaceMaterialSlotAssignment(MASSurfaceSlot.Toolbar, MASSurfaceMaterialIds.GraphiteMetal, MASSurfaceFrameIds.GraphiteMetal, MASSurfaceFrameStrength.Level4, 5),
                    New MASSurfaceMaterialSlotAssignment(MASSurfaceSlot.Chrome, MASSurfaceMaterialIds.GraphiteMetal, MASSurfaceFrameIds.GraphiteMetal, MASSurfaceFrameStrength.Level4, 5),
                    New MASSurfaceMaterialSlotAssignment(MASSurfaceSlot.Body, MASSurfaceMaterialIds.SoftMist, MASSurfaceFrameIds.SoftMist, MASSurfaceFrameStrength.Level3, 4)
                },
                notes:="Graphite-led chrome distribution while keeping body surfaces calm and readable.")
        End Function

        Private Shared Function CreateMediaSurfaceProfile() As MASSurfaceMaterialSlotProfile
            Return New MASSurfaceMaterialSlotProfile(
                id:=MASSurfaceMaterialProfileIds.MediaSurface,
                displayName:="Media Surface",
                assignments:=New MASSurfaceMaterialSlotAssignment() {
                    New MASSurfaceMaterialSlotAssignment(MASSurfaceSlot.Root, MASSurfaceMaterialIds.PlatformDefault, MASSurfaceFrameIds.PlatformDefault, MASSurfaceFrameStrength.Level3, 4),
                    New MASSurfaceMaterialSlotAssignment(MASSurfaceSlot.Toolbar, MASSurfaceMaterialIds.MediaCommandRail, MASSurfaceFrameIds.SoftMist, MASSurfaceFrameStrength.Level1, 3),
                    New MASSurfaceMaterialSlotAssignment(MASSurfaceSlot.Footer, MASSurfaceMaterialIds.MediaFooterChrome, MASSurfaceFrameIds.SoftMist, MASSurfaceFrameStrength.Level2, 3),
                    New MASSurfaceMaterialSlotAssignment(MASSurfaceSlot.Viewport, MASSurfaceMaterialIds.FrostedGlass, MASSurfaceFrameIds.FrostedGlass, MASSurfaceFrameStrength.Level1, 2),
                    New MASSurfaceMaterialSlotAssignment(MASSurfaceSlot.Overlay, MASSurfaceMaterialIds.MediaToolbarGlass, MASSurfaceFrameIds.FrostedGlass, MASSurfaceFrameStrength.Level3, 3)
                },
                notes:="Media distribution: PlatformDefault PanelShell root, dedicated command rail, integrated FrostedGlass media stage, calm footer rail, and floating toolbar glass overlays.")
        End Function

    End Class

End Namespace
