Option Strict On
Option Explicit On

Imports System

Namespace Nexamas.UI.Rendering

    ''' <summary>
    ''' Friend-only material-name normalizer used by the Surface Treatment runtime route.
    ''' It accepts concise material keys and legacy material.* ids, then returns canonical
    ''' surface.material.* ids. Legacy native aliases become canonical native variants, not separate identities.
    ''' </summary>
    Friend NotInheritable Class MASSurfaceTreatmentMaterialKeyNormalizer

        Private Sub New()
        End Sub

        Friend Shared Function NormalizeForStorage(materialKey As String) As String
            Dim key As String = NormalizeRaw(materialKey)
            If key.Length = 0 OrElse String.Equals(key, MASSurfaceMaterialIds.Auto, StringComparison.OrdinalIgnoreCase) Then
                Return MASSurfaceMaterialIds.Auto
            End If

            Return NormalizeAliasOrCanonical(key)
        End Function

        Friend Shared Function NormalizeForResolution(materialKey As String) As String
            Dim key As String = NormalizeForStorage(materialKey)
            If key.Length = 0 OrElse String.Equals(key, MASSurfaceMaterialIds.Auto, StringComparison.OrdinalIgnoreCase) Then
                Return MASSurfaceMaterialIds.PlatformDefault
            End If

            Return key
        End Function

        Friend Shared Function IsAutoOrEmpty(materialKey As String) As Boolean
            Dim key As String = NormalizeRaw(materialKey)
            Return key.Length = 0 OrElse String.Equals(key, MASSurfaceMaterialIds.Auto, StringComparison.OrdinalIgnoreCase)
        End Function

        Friend Shared Function IsExplicitMaterial(materialKey As String) As Boolean
            Return Not IsAutoOrEmpty(materialKey)
        End Function

        Friend Shared Function UsesLegacyMaterialPrefix(materialKey As String) As Boolean
            Dim key As String = NormalizeRaw(materialKey)
            Return key.StartsWith("material.", StringComparison.OrdinalIgnoreCase)
        End Function

        Private Shared Function NormalizeRaw(materialKey As String) As String
            Return If(materialKey, String.Empty).Trim()
        End Function

        Private Shared Function NormalizeAliasOrCanonical(key As String) As String
            Dim normalized As String = key.Trim()
            Dim compact As String = normalized.Replace("_", String.Empty).Replace("-", String.Empty).Replace(".", String.Empty).Replace(" ", String.Empty).ToLowerInvariant()

            Select Case compact
                Case "default", "platform", "platformdefault", "materialdefault", "surfacematerialplatformdefault"
                    Return MASSurfaceMaterialIds.PlatformDefault
                Case "soft", "mist", "softmist", "softglass", "materialsoftmist", "surfacematerialsoftmist"
                    Return MASSurfaceMaterialIds.SoftMist
                Case "glass", "frost", "frosted", "frostedglass", "materialfrostedglass", "surfacematerialfrostedglass"
                    Return MASSurfaceMaterialIds.FrostedGlass
                Case "crystal", "ice", "crystalice", "materialcrystalice", "surfacematerialcrystalice"
                    Return MASSurfaceMaterialIds.CrystalIce
                Case "nativecrystal", "nativeice", "nativecrystalice", "crystalnative", "icenative", "crystalicenative", "crystaliceidentity", "crystaliceidentitypreserving", "unthemedcrystal", "unthemedice", "unthemedcrystalice", "materialunthemedcrystalice", "surfacematerialcrystalicenative"
                    Return MASSurfaceMaterialIds.CrystalIceNative
                Case "paper", "warm", "warmpaper", "materialwarmpaper", "surfacematerialwarmpaper"
                    Return MASSurfaceMaterialIds.WarmPaper
                Case "nativepaper", "nativewarm", "nativewarmpaper", "papernative", "warmnative", "warmpapernative", "warmpaperidentity", "warmpaperidentitypreserving", "unthemedpaper", "unthemedwarm", "unthemedwarmpaper", "materialunthemedwarmpaper", "surfacematerialwarmpapernative"
                    Return MASSurfaceMaterialIds.WarmPaperNative
                Case "graphite", "metal", "graphitemetal", "materialgraphitemetal", "surfacematerialgraphitemetal"
                    Return MASSurfaceMaterialIds.GraphiteMetal
                Case Else
                    Return normalized
            End Select
        End Function

    End Class

End Namespace
