Option Strict On
Option Explicit On

Imports System
Imports System.Collections.Generic
Imports Nexamas.UI.DataBinding

Namespace Nexamas.UI.Components

    ''' <summary>
    ''' Friend-only governance probe for MASMasterDetailView source projection. It proves
    ''' stable source records can build master/detail items, update through IMASItemsSource
    ''' changes, preserve selection when keys survive, and detach on manual mutation.
    ''' </summary>
    Friend NotInheritable Class MASMasterDetailViewSourceProjectionGate
        Private Sub New()
        End Sub

        Friend Shared Function Passes() As Boolean
            Try
                If Not MASMasterDetailViewPolicy.HasDataSourceProjectionPath() Then Return False

                Dim records As New List(Of Object) From {
                    MASMasterDetailSourceRecord.Create("Alpha", "a", "First", "Alpha detail", "Alpha body", "A"),
                    MASMasterDetailSourceRecord.Create("Beta", "b", "Second", "Beta detail", "Beta body", "B"),
                    MASMasterDetailSourceRecord.Create("Gamma", "g", "Third", "Gamma detail", "Gamma body", "G")
                }
                Dim source As MASListItemsSource = MASListItemsSource.FromEnumerable(records, AddressOf ResolveProbeKey)
                Dim definition As MASMasterDetailSourceDefinition = MASMasterDetailSourceDefinition.Create(
                    keyField:="key",
                    titleField:="title",
                    subtitleField:="subtitle",
                    detailTitleField:="detailTitle",
                    detailTextField:="detail",
                    badgeTextField:="badge")

                Dim view As MASMasterDetailView = MASMasterDetailView.Create("Source master detail")
                view.SetMasterDetailSource(source, definition, "MASMasterDetailViewSourceProjectionGate")

                If Not view.HasMasterDetailSource Then Return False
                If view.MasterDetailSourceRevision < 0 Then Return False
                If view.ItemCount <> 3 Then Return False
                If view.GetProjectedMasterDetailKeys().Count <> 3 Then Return False
                If Not view.SelectItem("b") Then Return False

                source.Add(MASMasterDetailSourceRecord.Create("Delta", "d", "Fourth", "Delta detail", "Delta body", "D"))
                If view.ItemCount <> 4 Then Return False
                If view.SelectedItemKey <> "b" Then Return False
                If Not view.SelectItem("d") Then Return False

                view.AddItem("manual", "Manual", "Manual subtitle", "Manual detail", "Manual body", "M")
                If view.HasMasterDetailSource Then Return False
                If view.ItemCount <> 5 Then Return False
                If Not view.SelectItem("manual") Then Return False

                Return True
            Catch ex As Exception
                Nexamas.UI.Diagnostics.MASExceptionSilencer.SwallowDiagnosticOnly(ex, "MASMasterDetailViewSourceProjectionGate")
                Return False
            End Try
        End Function

        Private Shared Function ResolveProbeKey(item As Object) As String
            Dim record As MASMasterDetailSourceRecord = TryCast(item, MASMasterDetailSourceRecord)
            If record Is Nothing Then Return String.Empty
            Dim value As Object = Nothing
            If record.TryGetField("key", value) Then Return Convert.ToString(value, System.Globalization.CultureInfo.InvariantCulture)
            Return String.Empty
        End Function
    End Class

End Namespace
