Option Strict On
Option Explicit On

Imports System
Imports System.Collections.Generic
Imports System.Collections.ObjectModel

Namespace Nexamas.UI.Certification

    ''' <summary>
    ''' Immutable internal manifest proving that the SDK release surface is frozen and package-ready.
    ''' </summary>
    ''' <remarks>
    ''' This manifest records already-owned release facts only. It does not inspect source files,
    ''' execute PowerShell gates, run SDK tests, build packages, create controls, render, query
    ''' telemetry, or mutate platform state.
    ''' </remarks>
    Friend NotInheritable Class NexamasUISdkReleaseReadinessManifest
        Private ReadOnly _requiredGateNames As IReadOnlyList(Of String)
        Private ReadOnly _evidenceReportNames As IReadOnlyList(Of String)
        Private ReadOnly _ownershipContracts As IReadOnlyList(Of String)
        Private ReadOnly _publicNamespaceCategories As IReadOnlyList(Of String)

        Friend Sub New(status As NexamasUISdkReleaseReadinessStatus,
                       releaseName As String,
                       releaseId As String,
                       canonicalPublicTypeCount As Integer,
                       canonicalPublicMemberCount As Integer,
                       expectedSdkHarnessCount As Integer,
                       hasCanonicalPublicApiFreeze As Boolean,
                       hasCanonicalPublicMemberFreeze As Boolean,
                       hasPublicNamespaceManifestClassification As Boolean,
                       hasFriendFirstImplementationBoundary As Boolean,
                       hasPackagingContract As Boolean,
                       hasConsumerBoundaryDocumentation As Boolean,
                       hasCertificationCenterEvidence As Boolean,
                       hasCommercialGateRegistration As Boolean,
                       hasNoPublicTelemetryApi As Boolean,
                       hasNoDemoOwnedPlatformLogic As Boolean,
                       hasMonitoredCompatibilityDebt As Boolean,
                       requiredGateNames As IEnumerable(Of String),
                       evidenceReportNames As IEnumerable(Of String),
                       ownershipContracts As IEnumerable(Of String),
                       publicNamespaceCategories As IEnumerable(Of String),
                       summary As String)
            Me.Status = status
            Me.ReleaseName = NormalizeText(releaseName)
            Me.ReleaseId = NormalizeText(releaseId)
            Me.CanonicalPublicTypeCount = canonicalPublicTypeCount
            Me.CanonicalPublicMemberCount = canonicalPublicMemberCount
            Me.ExpectedSdkHarnessCount = expectedSdkHarnessCount
            Me.HasCanonicalPublicApiFreeze = hasCanonicalPublicApiFreeze
            Me.HasCanonicalPublicMemberFreeze = hasCanonicalPublicMemberFreeze
            Me.HasPublicNamespaceManifestClassification = hasPublicNamespaceManifestClassification
            Me.HasFriendFirstImplementationBoundary = hasFriendFirstImplementationBoundary
            Me.HasPackagingContract = hasPackagingContract
            Me.HasConsumerBoundaryDocumentation = hasConsumerBoundaryDocumentation
            Me.HasCertificationCenterEvidence = hasCertificationCenterEvidence
            Me.HasCommercialGateRegistration = hasCommercialGateRegistration
            Me.HasNoPublicTelemetryApi = hasNoPublicTelemetryApi
            Me.HasNoDemoOwnedPlatformLogic = hasNoDemoOwnedPlatformLogic
            Me.HasMonitoredCompatibilityDebt = hasMonitoredCompatibilityDebt
            _requiredGateNames = New ReadOnlyCollection(Of String)(NormalizeList(requiredGateNames))
            _evidenceReportNames = New ReadOnlyCollection(Of String)(NormalizeList(evidenceReportNames))
            _ownershipContracts = New ReadOnlyCollection(Of String)(NormalizeList(ownershipContracts))
            _publicNamespaceCategories = New ReadOnlyCollection(Of String)(NormalizeList(publicNamespaceCategories))
            Me.Summary = NormalizeText(summary)
        End Sub

        Friend ReadOnly Property Status As NexamasUISdkReleaseReadinessStatus
        Friend ReadOnly Property ReleaseName As String
        Friend ReadOnly Property ReleaseId As String
        Friend ReadOnly Property CanonicalPublicTypeCount As Integer
        Friend ReadOnly Property CanonicalPublicMemberCount As Integer
        Friend ReadOnly Property ExpectedSdkHarnessCount As Integer
        Friend ReadOnly Property HasCanonicalPublicApiFreeze As Boolean
        Friend ReadOnly Property HasCanonicalPublicMemberFreeze As Boolean
        Friend ReadOnly Property HasPublicNamespaceManifestClassification As Boolean
        Friend ReadOnly Property HasFriendFirstImplementationBoundary As Boolean
        Friend ReadOnly Property HasPackagingContract As Boolean
        Friend ReadOnly Property HasConsumerBoundaryDocumentation As Boolean
        Friend ReadOnly Property HasCertificationCenterEvidence As Boolean
        Friend ReadOnly Property HasCommercialGateRegistration As Boolean
        Friend ReadOnly Property HasNoPublicTelemetryApi As Boolean
        Friend ReadOnly Property HasNoDemoOwnedPlatformLogic As Boolean
        Friend ReadOnly Property HasMonitoredCompatibilityDebt As Boolean
        Friend ReadOnly Property Summary As String

        Friend ReadOnly Property RequiredGateNames As IReadOnlyList(Of String)
            Get
                Return _requiredGateNames
            End Get
        End Property

        Friend ReadOnly Property EvidenceReportNames As IReadOnlyList(Of String)
            Get
                Return _evidenceReportNames
            End Get
        End Property

        Friend ReadOnly Property OwnershipContracts As IReadOnlyList(Of String)
            Get
                Return _ownershipContracts
            End Get
        End Property

        Friend ReadOnly Property PublicNamespaceCategories As IReadOnlyList(Of String)
            Get
                Return _publicNamespaceCategories
            End Get
        End Property

        Friend ReadOnly Property HasCompleteSdkReleaseChain As Boolean
            Get
                Return Not String.IsNullOrWhiteSpace(ReleaseName) AndAlso
                       Not String.IsNullOrWhiteSpace(ReleaseId) AndAlso
                       CanonicalPublicTypeCount = 283 AndAlso
                       CanonicalPublicMemberCount = 3332 AndAlso
                       ExpectedSdkHarnessCount = 88 AndAlso
                       RequiredGateNames.Count >= 6 AndAlso
                       EvidenceReportNames.Count >= 6 AndAlso
                       OwnershipContracts.Count >= 6 AndAlso
                       PublicNamespaceCategories.Count >= 6 AndAlso
                       HasCanonicalPublicApiFreeze AndAlso
                       HasCanonicalPublicMemberFreeze AndAlso
                       HasPublicNamespaceManifestClassification AndAlso
                       HasFriendFirstImplementationBoundary AndAlso
                       HasPackagingContract AndAlso
                       HasConsumerBoundaryDocumentation AndAlso
                       HasCertificationCenterEvidence AndAlso
                       HasCommercialGateRegistration AndAlso
                       HasNoPublicTelemetryApi AndAlso
                       HasNoDemoOwnedPlatformLogic
            End Get
        End Property

        Friend ReadOnly Property IsReady As Boolean
            Get
                Return HasCompleteSdkReleaseChain AndAlso
                       (Status = NexamasUISdkReleaseReadinessStatus.Ready OrElse
                        Status = NexamasUISdkReleaseReadinessStatus.ReadyWithMonitoring)
            End Get
        End Property

        Friend ReadOnly Property HasReleaseBlocker As Boolean
            Get
                Return Status = NexamasUISdkReleaseReadinessStatus.BlockedByPublicContractDrift OrElse
                       Status = NexamasUISdkReleaseReadinessStatus.BlockedByPackagingContract OrElse
                       Status = NexamasUISdkReleaseReadinessStatus.BlockedByConsumerBoundary OrElse
                       Status = NexamasUISdkReleaseReadinessStatus.IncompleteGovernance OrElse
                       Not HasCompleteSdkReleaseChain
            End Get
        End Property

        Friend Shared Function CreateCurrent() As NexamasUISdkReleaseReadinessManifest
            Return CreateFromFacts(
                "Nexamas UI SDK Release Readiness & API Contract Freeze",
                canonicalPublicTypeCount:=283,
                canonicalPublicMemberCount:=3332,
                expectedSdkHarnessCount:=88,
                hasCanonicalPublicApiFreeze:=True,
                hasCanonicalPublicMemberFreeze:=True,
                hasPublicNamespaceManifestClassification:=True,
                hasFriendFirstImplementationBoundary:=True,
                hasPackagingContract:=True,
                hasConsumerBoundaryDocumentation:=True,
                hasCertificationCenterEvidence:=True,
                hasCommercialGateRegistration:=True,
                hasNoPublicTelemetryApi:=True,
                hasNoDemoOwnedPlatformLogic:=True,
                hasMonitoredCompatibilityDebt:=False)
        End Function

        Friend Shared Function CreateFromFacts(releaseName As String,
                                               canonicalPublicTypeCount As Integer,
                                               canonicalPublicMemberCount As Integer,
                                               expectedSdkHarnessCount As Integer,
                                               hasCanonicalPublicApiFreeze As Boolean,
                                               hasCanonicalPublicMemberFreeze As Boolean,
                                               hasPublicNamespaceManifestClassification As Boolean,
                                               hasFriendFirstImplementationBoundary As Boolean,
                                               hasPackagingContract As Boolean,
                                               hasConsumerBoundaryDocumentation As Boolean,
                                               hasCertificationCenterEvidence As Boolean,
                                               hasCommercialGateRegistration As Boolean,
                                               hasNoPublicTelemetryApi As Boolean,
                                               hasNoDemoOwnedPlatformLogic As Boolean,
                                               hasMonitoredCompatibilityDebt As Boolean) As NexamasUISdkReleaseReadinessManifest
            Dim status As NexamasUISdkReleaseReadinessStatus = ResolveStatus(canonicalPublicTypeCount,
                                                                               canonicalPublicMemberCount,
                                                                               expectedSdkHarnessCount,
                                                                               hasCanonicalPublicApiFreeze,
                                                                               hasCanonicalPublicMemberFreeze,
                                                                               hasPublicNamespaceManifestClassification,
                                                                               hasFriendFirstImplementationBoundary,
                                                                               hasPackagingContract,
                                                                               hasConsumerBoundaryDocumentation,
                                                                               hasCertificationCenterEvidence,
                                                                               hasCommercialGateRegistration,
                                                                               hasNoPublicTelemetryApi,
                                                                               hasNoDemoOwnedPlatformLogic,
                                                                               hasMonitoredCompatibilityDebt)
            Dim name As String = If(String.IsNullOrWhiteSpace(releaseName),
                                    "Nexamas UI SDK Release Readiness & API Contract Freeze",
                                    releaseName.Trim())

            Return New NexamasUISdkReleaseReadinessManifest(
                status,
                name,
                "MAS-SDK-RELEASE-READINESS-PUBLIC-CONTRACT-FREEZE-2026-06-19",
                canonicalPublicTypeCount,
                canonicalPublicMemberCount,
                expectedSdkHarnessCount,
                hasCanonicalPublicApiFreeze,
                hasCanonicalPublicMemberFreeze,
                hasPublicNamespaceManifestClassification,
                hasFriendFirstImplementationBoundary,
                hasPackagingContract,
                hasConsumerBoundaryDocumentation,
                hasCertificationCenterEvidence,
                hasCommercialGateRegistration,
                hasNoPublicTelemetryApi,
                hasNoDemoOwnedPlatformLogic,
                hasMonitoredCompatibilityDebt,
                CreateRequiredGateNames(),
                CreateEvidenceReportNames(),
                CreateOwnershipContracts(),
                CreatePublicNamespaceCategories(),
                ResolveSummary(status))
        End Function

        Private Shared Function ResolveStatus(canonicalPublicTypeCount As Integer,
                                              canonicalPublicMemberCount As Integer,
                                              expectedSdkHarnessCount As Integer,
                                              hasCanonicalPublicApiFreeze As Boolean,
                                              hasCanonicalPublicMemberFreeze As Boolean,
                                              hasPublicNamespaceManifestClassification As Boolean,
                                              hasFriendFirstImplementationBoundary As Boolean,
                                              hasPackagingContract As Boolean,
                                              hasConsumerBoundaryDocumentation As Boolean,
                                              hasCertificationCenterEvidence As Boolean,
                                              hasCommercialGateRegistration As Boolean,
                                              hasNoPublicTelemetryApi As Boolean,
                                              hasNoDemoOwnedPlatformLogic As Boolean,
                                              hasMonitoredCompatibilityDebt As Boolean) As NexamasUISdkReleaseReadinessStatus
            If canonicalPublicTypeCount <= 0 OrElse
               canonicalPublicMemberCount <= 0 OrElse
               expectedSdkHarnessCount <> 88 OrElse
               Not hasCertificationCenterEvidence OrElse
               Not hasCommercialGateRegistration Then
                Return NexamasUISdkReleaseReadinessStatus.IncompleteGovernance
            End If

            If canonicalPublicTypeCount <> 283 OrElse
               canonicalPublicMemberCount <> 3332 OrElse
               Not hasCanonicalPublicApiFreeze OrElse
               Not hasCanonicalPublicMemberFreeze OrElse
               Not hasPublicNamespaceManifestClassification OrElse
               Not hasFriendFirstImplementationBoundary OrElse
               Not hasNoPublicTelemetryApi Then
                Return NexamasUISdkReleaseReadinessStatus.BlockedByPublicContractDrift
            End If

            If Not hasPackagingContract Then
                Return NexamasUISdkReleaseReadinessStatus.BlockedByPackagingContract
            End If

            If Not hasConsumerBoundaryDocumentation OrElse Not hasNoDemoOwnedPlatformLogic Then
                Return NexamasUISdkReleaseReadinessStatus.BlockedByConsumerBoundary
            End If

            If hasMonitoredCompatibilityDebt Then
                Return NexamasUISdkReleaseReadinessStatus.ReadyWithMonitoring
            End If

            Return NexamasUISdkReleaseReadinessStatus.Ready
        End Function

        Private Shared Function ResolveSummary(status As NexamasUISdkReleaseReadinessStatus) As String
            Select Case status
                Case NexamasUISdkReleaseReadinessStatus.Ready
                    Return "Nexamas UI SDK release readiness is closed: public type/member contracts are frozen, package metadata is stable, and consumer entry points stay behind official MAS gateways."
                Case NexamasUISdkReleaseReadinessStatus.ReadyWithMonitoring
                    Return "Nexamas UI SDK release readiness is closed with monitored compatibility debt recorded for a future public-surface pass."
                Case NexamasUISdkReleaseReadinessStatus.BlockedByPublicContractDrift
                    Return "SDK release readiness is blocked by public API/member drift or an implementation contract exposed outside the Friend-first boundary."
                Case NexamasUISdkReleaseReadinessStatus.BlockedByPackagingContract
                    Return "SDK release readiness is blocked by package metadata or distribution contract evidence."
                Case NexamasUISdkReleaseReadinessStatus.BlockedByConsumerBoundary
                    Return "SDK release readiness is blocked by consumer-boundary or demo-ownership evidence."
                Case Else
                    Return "SDK release readiness is incomplete because the certification or commercial-gate chain is not fully registered."
            End Select
        End Function

        Private Shared Function CreateRequiredGateNames() As IReadOnlyList(Of String)
            Return New ReadOnlyCollection(Of String)(New List(Of String) From {
                "tools/quality/Run-NexamasUIQuality.ps1",
                "tools/quality/Run-NexamasUIQuality.ps1",
                "tools/quality/Run-NexamasUIQuality.ps1",
                "tools/quality/Run-NexamasUIQuality.ps1",
                "tools/quality/Run-NexamasUIQuality.ps1",
                "tools/quality/Run-NexamasUIQuality.ps1",
                "tools/quality/Run-NexamasUIQuality.ps1",
                "tools/quality/Run-NexamasUIQuality.ps1",
                "eng/tests/Run-NexamasUISdkHarness.ps1"
            })
        End Function

        Private Shared Function CreateEvidenceReportNames() As IReadOnlyList(Of String)
            Return New ReadOnlyCollection(Of String)(New List(Of String) From {
                "MAS_PUBLIC_API_CANONICAL_SURFACE.md",
                "MAS_PUBLIC_MEMBER_CANONICAL_SURFACE.md",
                "MAS_PUBLIC_API_MANIFEST.md",
                "MAS_PUBLIC_API_FINAL_LOCKDOWN_2026_06_20.md",
                "ReleaseChecklist.md",
                "NEXAMAS_UI_CERTIFICATION_CENTER_COMMERCIAL_EVIDENCE_SURFACE_2026_06_19.md",
                "MAS_CERTIFICATION_CENTER_SURFACE_READINESS_FINAL_AUDIT_2026_06_19.md",
                "MAS_SDK_RELEASE_READINESS_PUBLIC_CONTRACT_FREEZE_2026_06_19.md"
            })
        End Function

        Private Shared Function CreateOwnershipContracts() As IReadOnlyList(Of String)
            Return New ReadOnlyCollection(Of String)(New List(Of String) From {
                "NexamasUISdkReleaseReadinessManifest",
                "NexamasUICertificationManifest",
                "NexamasUICertificationCenterPage",
                "NexamasUICertification.AttachCenter",
                "MAS_PUBLIC_API_CANONICAL_SURFACE.md",
                "MAS_PUBLIC_MEMBER_CANONICAL_SURFACE.md",
                "MAS_PUBLIC_API_MANIFEST.md",
                "MAS_PUBLIC_API_FINAL_LOCKDOWN_2026_06_20.md",
                "Nexamas.UI.nuspec"
            })
        End Function

        Private Shared Function CreatePublicNamespaceCategories() As IReadOnlyList(Of String)
            Return New ReadOnlyCollection(Of String)(New List(Of String) From {
                "StableConsumer",
                "AdvancedConsumer",
                "ThemeSelection",
                "DesignInspection",
                "ProductProof",
                "HostIntegration"
            })
        End Function

        Private Shared Function NormalizeList(values As IEnumerable(Of String)) As List(Of String)
            Dim result As New List(Of String)()
            If values Is Nothing Then Return result

            For Each value As String In values
                Dim normalized As String = NormalizeText(value)
                If normalized.Length > 0 AndAlso Not result.Contains(normalized) Then result.Add(normalized)
            Next

            Return result
        End Function

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

End Namespace
