Option Strict On
Option Explicit On

Imports System

Namespace Nexamas.UI.Components

    Friend Enum MASDashboardGridProviderAdapterPolicyMode
        Unknown = 0
        InternalProjectionOnly = 1
        PublicAdapterDeferred = 2
    End Enum

    ''' <summary>
    ''' Friend-only policy snapshot for DashboardGrid provider exposure. It closes
    ''' the production gap by making the current boundary explicit: DashboardGrid
    ''' owns an internal provider-refresh projection contract, but it does not expose
    ''' a public provider adapter, external storage bridge, or shell refresh loop.
    ''' </summary>
    Friend NotInheritable Class MASDashboardGridProviderAdapterPolicySnapshot
        Friend Sub New(version As Integer,
                       componentId As String,
                       evidenceKey As String,
                       mode As MASDashboardGridProviderAdapterPolicyMode,
                       exposesPublicProviderAdapter As Boolean,
                       supportsInternalProviderRefresh As Boolean,
                       ownsExternalStorage As Boolean,
                       ownsShellRefreshLoop As Boolean,
                       hasCommandBoundary As Boolean,
                       hasDocumentedPreviewBoundary As Boolean,
                       note As String)
            Me.Version = Math.Max(1, version)
            Me.ComponentId = Normalize(componentId)
            Me.EvidenceKey = Normalize(evidenceKey)
            Me.Mode = mode
            Me.ExposesPublicProviderAdapter = exposesPublicProviderAdapter
            Me.SupportsInternalProviderRefresh = supportsInternalProviderRefresh
            Me.OwnsExternalStorage = ownsExternalStorage
            Me.OwnsShellRefreshLoop = ownsShellRefreshLoop
            Me.HasCommandBoundary = hasCommandBoundary
            Me.HasDocumentedPreviewBoundary = hasDocumentedPreviewBoundary
            Me.Note = Normalize(note)
        End Sub

        Friend ReadOnly Property Version As Integer
        Friend ReadOnly Property ComponentId As String
        Friend ReadOnly Property EvidenceKey As String
        Friend ReadOnly Property Mode As MASDashboardGridProviderAdapterPolicyMode
        Friend ReadOnly Property ExposesPublicProviderAdapter As Boolean
        Friend ReadOnly Property SupportsInternalProviderRefresh As Boolean
        Friend ReadOnly Property OwnsExternalStorage As Boolean
        Friend ReadOnly Property OwnsShellRefreshLoop As Boolean
        Friend ReadOnly Property HasCommandBoundary As Boolean
        Friend ReadOnly Property HasDocumentedPreviewBoundary As Boolean
        Friend ReadOnly Property Note As String

        Friend ReadOnly Property IsStructurallyValid As Boolean
            Get
                Return Version > 0 AndAlso
                       ComponentId.Length > 0 AndAlso
                       EvidenceKey.Length > 0 AndAlso
                       Mode <> MASDashboardGridProviderAdapterPolicyMode.Unknown AndAlso
                       Note.Length > 0
            End Get
        End Property

        Friend ReadOnly Property IsClosedPreviewPolicy As Boolean
            Get
                Return IsStructurallyValid AndAlso
                       Mode = MASDashboardGridProviderAdapterPolicyMode.InternalProjectionOnly AndAlso
                       SupportsInternalProviderRefresh AndAlso
                       HasCommandBoundary AndAlso
                       HasDocumentedPreviewBoundary AndAlso
                       Not ExposesPublicProviderAdapter AndAlso
                       Not OwnsExternalStorage AndAlso
                       Not OwnsShellRefreshLoop
            End Get
        End Property

        Private Shared Function Normalize(value As String) As String
            If value Is Nothing Then Return String.Empty
            Dim text As String = value.Trim()
            Do While text.Contains("  ")
                text = text.Replace("  ", " ")
            Loop
            Return text
        End Function
    End Class

    Partial Public NotInheritable Class MASDashboardGrid

#Region "Friend provider adapter policy boundary"

        Friend Function CreateProviderAdapterPolicySnapshot() As MASDashboardGridProviderAdapterPolicySnapshot
            Return New MASDashboardGridProviderAdapterPolicySnapshot(
                1,
                "dashboardgrid",
                "DashboardGrid.PublicProviderAdapter",
                MASDashboardGridProviderAdapterPolicyMode.InternalProjectionOnly,
                exposesPublicProviderAdapter:=False,
                supportsInternalProviderRefresh:=MASDashboardGridPolicy.HasWidgetProviderRefreshContractPath(),
                ownsExternalStorage:=False,
                ownsShellRefreshLoop:=False,
                hasCommandBoundary:=True,
                hasDocumentedPreviewBoundary:=True,
                note:="DashboardGrid exposes only an internal provider-refresh projection contract for its promoted visual dashboard boundary; public provider/write-back adapters remain intentionally outside this ProductionReady surface.")
        End Function

        Friend Function HasProviderAdapterPolicyForTests() As Boolean
            Dim snapshot As MASDashboardGridProviderAdapterPolicySnapshot = CreateProviderAdapterPolicySnapshot()
            If snapshot Is Nothing OrElse Not snapshot.IsClosedPreviewPolicy Then Return False
            If snapshot.ExposesPublicProviderAdapter OrElse snapshot.OwnsExternalStorage OrElse snapshot.OwnsShellRefreshLoop Then Return False
            If Not HasWidgetProviderRefreshContractForTests() Then Return False
            Return True
        End Function

#End Region

    End Class

End Namespace
