Option Strict On
Option Explicit On

Namespace Nexamas.UI.DataBinding

    ''' <summary>
    ''' Friend-only field mapping used by MASMasterDetailView source projection.
    ''' It maps a stable keyed items-source snapshot into visual master/detail
    ''' item fields without introducing object inspection, routing, storage, or
    ''' application provider ownership into the control.
    ''' </summary>
    Friend NotInheritable Class MASMasterDetailSourceDefinition
        Private Sub New(keyField As String,
                        titleField As String,
                        subtitleField As String,
                        detailTitleField As String,
                        detailTextField As String,
                        badgeTextField As String)
            Me.KeyField = NormalizeFieldName(keyField)
            Me.TitleField = NormalizeFieldName(titleField)
            Me.SubtitleField = NormalizeFieldName(subtitleField)
            Me.DetailTitleField = NormalizeFieldName(detailTitleField)
            Me.DetailTextField = NormalizeFieldName(detailTextField)
            Me.BadgeTextField = NormalizeFieldName(badgeTextField)
        End Sub

        Friend Shared Function Create(Optional keyField As String = "key",
                                      Optional titleField As String = "title",
                                      Optional subtitleField As String = "subtitle",
                                      Optional detailTitleField As String = "detailTitle",
                                      Optional detailTextField As String = "detail",
                                      Optional badgeTextField As String = "badge") As MASMasterDetailSourceDefinition
            Return New MASMasterDetailSourceDefinition(keyField, titleField, subtitleField, detailTitleField, detailTextField, badgeTextField)
        End Function

        Friend ReadOnly Property KeyField As String
        Friend ReadOnly Property TitleField As String
        Friend ReadOnly Property SubtitleField As String
        Friend ReadOnly Property DetailTitleField As String
        Friend ReadOnly Property DetailTextField As String
        Friend ReadOnly Property BadgeTextField As String

        Friend ReadOnly Property IsValid As Boolean
            Get
                Return TitleField.Length > 0 OrElse DetailTextField.Length > 0
            End Get
        End Property

        Private Shared Function NormalizeFieldName(value As String) As String
            Dim text As String = If(value, String.Empty).Trim()
            If text.Length > 96 Then text = text.Substring(0, 96)
            Return text
        End Function
    End Class

End Namespace
