Option Strict On
Option Explicit On

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

Namespace Nexamas.UI.Certification

    ''' <summary>
    ''' Immutable result produced by a single Quality Orchestrator gate.
    ''' </summary>
    ''' <remarks>
    ''' A gate result is evidence metadata only. It does not expose public telemetry, mutable probes,
    ''' render captures, diagnostics streams, or raw file-system scanners outside Nexamas.UI.
    ''' </remarks>
    Friend NotInheritable Class MASQualityGateResult
        Private ReadOnly _details As IReadOnlyList(Of String)

        Friend Sub New(gateKey As String,
                       displayName As String,
                       ownerName As String,
                       certificationSystemKey As String,
                       status As MASQualityGateStatus,
                       isBlocking As Boolean,
                       errorCount As Integer,
                       warningCount As Integer,
                       summary As String,
                       details As IEnumerable(Of String))
            Me.GateKey = Normalize(gateKey)
            Me.DisplayName = Normalize(displayName)
            Me.OwnerName = Normalize(ownerName)
            Me.CertificationSystemKey = Normalize(certificationSystemKey)
            Me.Status = status
            Me.IsBlocking = isBlocking
            Me.ErrorCount = Math.Max(0, errorCount)
            Me.WarningCount = Math.Max(0, warningCount)
            Me.Summary = Normalize(summary)
            _details = New ReadOnlyCollection(Of String)(NormalizeDetails(details))
        End Sub

        Friend ReadOnly Property GateKey As String
        Friend ReadOnly Property DisplayName As String
        Friend ReadOnly Property OwnerName As String
        Friend ReadOnly Property CertificationSystemKey As String
        Friend ReadOnly Property Status As MASQualityGateStatus
        Friend ReadOnly Property IsBlocking As Boolean
        Friend ReadOnly Property ErrorCount As Integer
        Friend ReadOnly Property WarningCount As Integer
        Friend ReadOnly Property Summary As String

        Friend ReadOnly Property Details As IReadOnlyList(Of String)
            Get
                Return _details
            End Get
        End Property

        Friend ReadOnly Property HasProblem As Boolean
            Get
                Return Status = MASQualityGateStatus.Failed OrElse
                       Status = MASQualityGateStatus.PassedWithWarnings OrElse
                       Status = MASQualityGateStatus.Skipped OrElse
                       ErrorCount > 0 OrElse
                       WarningCount > 0
            End Get
        End Property

        Friend ReadOnly Property CertificationStatus As NexamasUICertificationStatus
            Get
                If Status = MASQualityGateStatus.Failed OrElse IsBlocking Then Return NexamasUICertificationStatus.Blocked
                If Status = MASQualityGateStatus.PassedWithWarnings OrElse Status = MASQualityGateStatus.Skipped Then Return NexamasUICertificationStatus.CertifiedWithMonitoring
                Return NexamasUICertificationStatus.Certified
            End Get
        End Property

        Friend Shared Function Passed(gateKey As String,
                                      displayName As String,
                                      ownerName As String,
                                      certificationSystemKey As String,
                                      summary As String,
                                      details As IEnumerable(Of String)) As MASQualityGateResult
            Return New MASQualityGateResult(gateKey,
                                            displayName,
                                            ownerName,
                                            certificationSystemKey,
                                            MASQualityGateStatus.Passed,
                                            isBlocking:=False,
                                            errorCount:=0,
                                            warningCount:=0,
                                            summary:=summary,
                                            details:=details)
        End Function

        Friend Shared Function PassedWithWarnings(gateKey As String,
                                                  displayName As String,
                                                  ownerName As String,
                                                  certificationSystemKey As String,
                                                  warningCount As Integer,
                                                  summary As String,
                                                  details As IEnumerable(Of String)) As MASQualityGateResult
            Return New MASQualityGateResult(gateKey,
                                            displayName,
                                            ownerName,
                                            certificationSystemKey,
                                            MASQualityGateStatus.PassedWithWarnings,
                                            isBlocking:=False,
                                            errorCount:=0,
                                            warningCount:=warningCount,
                                            summary:=summary,
                                            details:=details)
        End Function

        Friend Shared Function Failed(gateKey As String,
                                      displayName As String,
                                      ownerName As String,
                                      certificationSystemKey As String,
                                      errorCount As Integer,
                                      warningCount As Integer,
                                      summary As String,
                                      details As IEnumerable(Of String)) As MASQualityGateResult
            Return New MASQualityGateResult(gateKey,
                                            displayName,
                                            ownerName,
                                            certificationSystemKey,
                                            MASQualityGateStatus.Failed,
                                            isBlocking:=True,
                                            errorCount:=errorCount,
                                            warningCount:=warningCount,
                                            summary:=summary,
                                            details:=details)
        End Function

        Friend Shared Function Skipped(gateKey As String,
                                       displayName As String,
                                       ownerName As String,
                                       certificationSystemKey As String,
                                       summary As String,
                                       details As IEnumerable(Of String)) As MASQualityGateResult
            Return New MASQualityGateResult(gateKey,
                                            displayName,
                                            ownerName,
                                            certificationSystemKey,
                                            MASQualityGateStatus.Skipped,
                                            isBlocking:=False,
                                            errorCount:=0,
                                            warningCount:=1,
                                            summary:=summary,
                                            details:=details)
        End Function

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

            For Each detail As String In details
                Dim normalized As String = Normalize(detail)
                If normalized.Length > 0 Then result.Add(normalized)
            Next

            Return result
        End Function

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

End Namespace
