Option Strict On
Option Explicit On

Namespace Nexamas.UI.DataBinding

    ''' <summary>
    ''' Friend-only field definition for projecting stable-keyed agenda events from an
    ''' IMASItemsSource snapshot. It deliberately covers event identity, title,
    ''' start/end timestamps, and optional details only; recurrence, time-zone
    ''' conversion, external calendar providers, and reminder transports remain outside
    ''' MASAgendaView.
    ''' </summary>
    Friend NotInheritable Class MASAgendaSourceDefinition

        Friend Sub New(titleField As String,
                       startField As String,
                       endField As String,
                       Optional keyField As String = "key",
                       Optional detailField As String = "detail")
            Me.TitleField = NormalizeFieldName(titleField)
            Me.StartField = NormalizeFieldName(startField)
            Me.EndField = NormalizeFieldName(endField)
            Me.KeyField = NormalizeFieldName(keyField)
            Me.DetailField = NormalizeFieldName(detailField)
        End Sub

        Friend ReadOnly Property TitleField As String
        Friend ReadOnly Property StartField As String
        Friend ReadOnly Property EndField As String
        Friend ReadOnly Property KeyField As String
        Friend ReadOnly Property DetailField As String

        Friend ReadOnly Property IsValid As Boolean
            Get
                Return TitleField.Length > 0 AndAlso StartField.Length > 0 AndAlso EndField.Length > 0
            End Get
        End Property

        Friend Shared Function Create(titleField As String,
                                      startField As String,
                                      endField As String,
                                      Optional keyField As String = "key",
                                      Optional detailField As String = "detail") As MASAgendaSourceDefinition
            Return New MASAgendaSourceDefinition(titleField, startField, endField, keyField, detailField)
        End Function

        Private Shared Function NormalizeFieldName(value As String) As String
            Dim normalized As String = If(value, String.Empty).Trim()
            normalized = normalized.Replace(ControlChars.Cr, " "c).Replace(ControlChars.Lf, " "c).Replace(ControlChars.Tab, " "c)
            While normalized.Contains("  ")
                normalized = normalized.Replace("  ", " ")
            End While
            If normalized.Length > 96 Then normalized = normalized.Substring(0, 96)
            Return normalized
        End Function

    End Class

End Namespace
