Option Strict On
Option Explicit On

Namespace Nexamas.UI.Rendering

    ''' <summary>
    ''' Final source-level evidence that the Surface Material system is commercially ready as an
    ''' internal owner: canonical materials, frame pairing, generic slot routing, designer projection,
    ''' and runtime application all agree without exposing a public API or creating element-owned names.
    ''' </summary>
    Friend NotInheritable Class MASSurfaceMaterialIntegrityReport

        Friend Sub New(name As String,
                       status As MASSurfaceMaterialIntegrityStatus,
                       materialDefinitionCount As Integer,
                       publicSelectableMaterialCount As Integer,
                       identityPreservingNativeVariantCount As Integer,
                       slotProfileCount As Integer,
                       slotAssignmentCount As Integer,
                       hasCanonicalMaterialDefinitions As Boolean,
                       hasCanonicalFramePairing As Boolean,
                       hasGenericSlotProfiles As Boolean,
                       hasDesignerProjection As Boolean,
                       hasSurfaceOnlyScopeBoundary As Boolean,
                       hasRuntimeMaterialKeyRoute As Boolean,
                       notes As String)
            Me.Name = Normalize(name, "Surface Material Integrity")
            Me.Status = status
            Me.MaterialDefinitionCount = ClampCount(materialDefinitionCount)
            Me.PublicSelectableMaterialCount = ClampCount(publicSelectableMaterialCount)
            Me.IdentityPreservingNativeVariantCount = ClampCount(identityPreservingNativeVariantCount)
            Me.SlotProfileCount = ClampCount(slotProfileCount)
            Me.SlotAssignmentCount = ClampCount(slotAssignmentCount)
            Me.HasCanonicalMaterialDefinitions = hasCanonicalMaterialDefinitions
            Me.HasCanonicalFramePairing = hasCanonicalFramePairing
            Me.HasGenericSlotProfiles = hasGenericSlotProfiles
            Me.HasDesignerProjection = hasDesignerProjection
            Me.HasSurfaceOnlyScopeBoundary = hasSurfaceOnlyScopeBoundary
            Me.HasRuntimeMaterialKeyRoute = hasRuntimeMaterialKeyRoute
            Me.Notes = Normalize(notes, String.Empty)
        End Sub

        Friend ReadOnly Property Name As String
        Friend ReadOnly Property Status As MASSurfaceMaterialIntegrityStatus
        Friend ReadOnly Property MaterialDefinitionCount As Integer
        Friend ReadOnly Property PublicSelectableMaterialCount As Integer
        Friend ReadOnly Property IdentityPreservingNativeVariantCount As Integer
        Friend ReadOnly Property SlotProfileCount As Integer
        Friend ReadOnly Property SlotAssignmentCount As Integer
        Friend ReadOnly Property HasCanonicalMaterialDefinitions As Boolean
        Friend ReadOnly Property HasCanonicalFramePairing As Boolean
        Friend ReadOnly Property HasGenericSlotProfiles As Boolean
        Friend ReadOnly Property HasDesignerProjection As Boolean
        Friend ReadOnly Property HasSurfaceOnlyScopeBoundary As Boolean
        Friend ReadOnly Property HasRuntimeMaterialKeyRoute As Boolean
        Friend ReadOnly Property Notes As String

        Friend ReadOnly Property IsCommerciallyReady As Boolean
            Get
                Return Status = MASSurfaceMaterialIntegrityStatus.CommerciallyReady AndAlso
                       MaterialDefinitionCount >= 8 AndAlso
                       PublicSelectableMaterialCount >= 8 AndAlso
                       IdentityPreservingNativeVariantCount >= 2 AndAlso
                       SlotProfileCount >= 5 AndAlso
                       SlotAssignmentCount >= 10 AndAlso
                       HasCanonicalMaterialDefinitions AndAlso
                       HasCanonicalFramePairing AndAlso
                       HasGenericSlotProfiles AndAlso
                       HasDesignerProjection AndAlso
                       HasSurfaceOnlyScopeBoundary AndAlso
                       HasRuntimeMaterialKeyRoute
            End Get
        End Property

        Private Shared Function ClampCount(value As Integer) As Integer
            If value < 0 Then Return 0
            Return value
        End Function

        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

    End Class

End Namespace
