Option Strict On
Option Explicit On

Imports System
Imports System.Collections.Generic

Namespace Nexamas.UI.Quality

    ''' <summary>
    ''' Release-freeze evidence lockdown gate for the product-controls CompactPreview closure pack.
    ''' It validates declared evidence routes and stage boundaries without opening production APIs.
    ''' </summary>
    Friend NotInheritable Class MASReleaseFreezeEvidenceLockdownGate

        Private Sub New()
        End Sub

        Friend Shared Function Passes() As Boolean
            Return EvaluateFindings().Count = 0
        End Function

        Friend Shared Function EvaluateFindings() As IReadOnlyList(Of MASCommercialReadinessFinding)
            Dim findings As New List(Of MASCommercialReadinessFinding)()
            Dim manifest As MASReleaseFreezeEvidenceManifest = Nothing

            Try
                manifest = MASReleaseFreezeEvidenceManifest.CreateDefault()
            Catch ex As Exception
                Nexamas.UI.Diagnostics.MASExceptionSilencer.SwallowDiagnosticOnly(ex, "MASReleaseFreezeEvidenceLockdownGate.CreateDefault")
                findings.Add(New MASCommercialReadinessFinding("release-freeze", "Build", MASCommercialReadinessFindingSeverity.Error, "Release-freeze evidence manifest could not be built."))
                Return findings
            End Try

            If manifest Is Nothing Then
                findings.Add(New MASCommercialReadinessFinding("release-freeze", "Manifest", MASCommercialReadinessFindingSeverity.Error, "Release-freeze evidence manifest is missing."))
                Return findings
            End If

            If Not manifest.HasExpectedCoverage Then
                findings.Add(New MASCommercialReadinessFinding("release-freeze", "Coverage", MASCommercialReadinessFindingSeverity.Error, "Release-freeze evidence manifest must include the required final product-controls evidence routes."))
            End If

            If Not manifest.HasNoDuplicateEvidenceKeys Then
                findings.Add(New MASCommercialReadinessFinding("release-freeze", "DuplicateKeys", MASCommercialReadinessFindingSeverity.Error, "Release-freeze evidence manifest contains duplicate evidence keys."))
            End If

            For Each record As MASReleaseFreezeEvidenceRecord In manifest.Records
                If record Is Nothing Then
                    findings.Add(New MASCommercialReadinessFinding("release-freeze", "Record", MASCommercialReadinessFindingSeverity.Error, "Release-freeze evidence manifest contains a null record."))
                    Continue For
                End If

                If Not record.IsStructurallyValid Then
                    findings.Add(New MASCommercialReadinessFinding(record.EvidenceKey, "Structure", MASCommercialReadinessFindingSeverity.Error, record.Title & " release-freeze evidence record is structurally invalid."))
                End If
            Next

            Return findings
        End Function

    End Class

End Namespace
