Option Strict On
Option Explicit On

Imports System

Namespace Nexamas.UI.Certification

    ''' <summary>
    ''' Immutable internal row for one certified Nexamas UI governance area.
    ''' </summary>
    ''' <remarks>
    ''' This contract is not a public telemetry API and does not execute gates, read scripts,
    ''' inspect files, run captures, create controls, or query runtime systems. It records the
    ''' already-owned closure evidence names that the Certification Center may display.
    ''' </remarks>
    Friend NotInheritable Class NexamasUICertificationEntry
        Friend Sub New(systemKey As String,
                       displayName As String,
                       status As NexamasUICertificationStatus,
                       closureContractName As String,
                       closureGateName As String,
                       evidenceReportName As String,
                       summary As String)
            Me.SystemKey = NormalizeText(systemKey)
            Me.DisplayName = NormalizeText(displayName)
            Me.Status = status
            Me.ClosureContractName = NormalizeText(closureContractName)
            Me.ClosureGateName = NormalizeText(closureGateName)
            Me.EvidenceReportName = NormalizeText(evidenceReportName)
            Me.Summary = NormalizeText(summary)
        End Sub

        Friend ReadOnly Property SystemKey As String
        Friend ReadOnly Property DisplayName As String
        Friend ReadOnly Property Status As NexamasUICertificationStatus
        Friend ReadOnly Property ClosureContractName As String
        Friend ReadOnly Property ClosureGateName As String
        Friend ReadOnly Property EvidenceReportName As String
        Friend ReadOnly Property Summary As String

        Friend ReadOnly Property HasCompleteEvidencePointer As Boolean
            Get
                Return Not String.IsNullOrWhiteSpace(SystemKey) AndAlso
                       Not String.IsNullOrWhiteSpace(DisplayName) AndAlso
                       Not String.IsNullOrWhiteSpace(ClosureContractName) AndAlso
                       Not String.IsNullOrWhiteSpace(ClosureGateName) AndAlso
                       Not String.IsNullOrWhiteSpace(EvidenceReportName)
            End Get
        End Property

        Friend ReadOnly Property IsCertified As Boolean
            Get
                Return Status = NexamasUICertificationStatus.Certified OrElse
                       Status = NexamasUICertificationStatus.CertifiedWithMonitoring
            End Get
        End Property

        Friend ReadOnly Property HasBlocker As Boolean
            Get
                Return Status = NexamasUICertificationStatus.Blocked OrElse
                       Status = NexamasUICertificationStatus.IncompleteGovernance OrElse
                       Not HasCompleteEvidencePointer
            End Get
        End Property

        Friend Shared Function Certified(systemKey As String,
                                         displayName As String,
                                         closureContractName As String,
                                         closureGateName As String,
                                         evidenceReportName As String,
                                         summary As String) As NexamasUICertificationEntry
            Return New NexamasUICertificationEntry(systemKey,
                                                     displayName,
                                                     NexamasUICertificationStatus.Certified,
                                                     closureContractName,
                                                     closureGateName,
                                                     evidenceReportName,
                                                     summary)
        End Function

        Friend Shared Function CertifiedWithMonitoring(systemKey As String,
                                                       displayName As String,
                                                       closureContractName As String,
                                                       closureGateName As String,
                                                       evidenceReportName As String,
                                                       summary As String) As NexamasUICertificationEntry
            Return New NexamasUICertificationEntry(systemKey,
                                                     displayName,
                                                     NexamasUICertificationStatus.CertifiedWithMonitoring,
                                                     closureContractName,
                                                     closureGateName,
                                                     evidenceReportName,
                                                     summary)
        End Function

        Friend Shared Function EvidenceDeclared(systemKey As String,
                                                displayName As String,
                                                closureContractName As String,
                                                closureGateName As String,
                                                evidenceReportName As String,
                                                summary As String) As NexamasUICertificationEntry
            Return New NexamasUICertificationEntry(systemKey,
                                                     displayName,
                                                     NexamasUICertificationStatus.EvidenceDeclared,
                                                     closureContractName,
                                                     closureGateName,
                                                     evidenceReportName,
                                                     summary)
        End Function

        Friend Shared Function Blocked(systemKey As String,
                                       displayName As String,
                                       closureContractName As String,
                                       closureGateName As String,
                                       evidenceReportName As String,
                                       summary As String) As NexamasUICertificationEntry
            Return New NexamasUICertificationEntry(systemKey,
                                                     displayName,
                                                     NexamasUICertificationStatus.Blocked,
                                                     closureContractName,
                                                     closureGateName,
                                                     evidenceReportName,
                                                     summary)
        End Function

        Friend Shared Function Incomplete(systemKey As String,
                                          displayName As String,
                                          closureContractName As String,
                                          closureGateName As String,
                                          evidenceReportName As String,
                                          summary As String) As NexamasUICertificationEntry
            Return New NexamasUICertificationEntry(systemKey,
                                                     displayName,
                                                     NexamasUICertificationStatus.IncompleteGovernance,
                                                     closureContractName,
                                                     closureGateName,
                                                     evidenceReportName,
                                                     summary)
        End Function

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

End Namespace
