Option Strict On
Option Explicit On

Namespace Nexamas.UI.DataBinding

    ''' <summary>
    ''' Friend-only field definition for projecting a stable-keyed IMASItemsSource
    ''' snapshot into MASKanbanBoard columns and cards. It deliberately describes
    ''' data shape only; workflow persistence, task engines, remote providers, and
    ''' background sync remain outside the visual board.
    ''' </summary>
    Friend NotInheritable Class MASKanbanSourceDefinition

        Friend Sub New(columnKeyField As String,
                       cardTitleField As String,
                       Optional columnTitleField As String = Nothing,
                       Optional cardKeyField As String = Nothing,
                       Optional cardDetailField As String = Nothing,
                       Optional badgeTextField As String = Nothing)
            Me.ColumnKeyField = NormalizeFieldName(columnKeyField)
            Me.ColumnTitleField = NormalizeFieldName(columnTitleField)
            Me.CardKeyField = NormalizeFieldName(cardKeyField)
            Me.CardTitleField = NormalizeFieldName(cardTitleField)
            Me.CardDetailField = NormalizeFieldName(cardDetailField)
            Me.BadgeTextField = NormalizeFieldName(badgeTextField)
        End Sub

        Friend ReadOnly Property ColumnKeyField As String
        Friend ReadOnly Property ColumnTitleField As String
        Friend ReadOnly Property CardKeyField As String
        Friend ReadOnly Property CardTitleField As String
        Friend ReadOnly Property CardDetailField As String
        Friend ReadOnly Property BadgeTextField As String

        Friend ReadOnly Property IsValid As Boolean
            Get
                Return ColumnKeyField.Length > 0 AndAlso CardTitleField.Length > 0
            End Get
        End Property

        Friend Shared Function Create(columnKeyField As String,
                                      cardTitleField As String,
                                      Optional columnTitleField As String = Nothing,
                                      Optional cardKeyField As String = Nothing,
                                      Optional cardDetailField As String = Nothing,
                                      Optional badgeTextField As String = Nothing) As MASKanbanSourceDefinition
            Return New MASKanbanSourceDefinition(columnKeyField,
                                                cardTitleField,
                                                columnTitleField,
                                                cardKeyField,
                                                cardDetailField,
                                                badgeTextField)
        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
