Option Strict On
Option Explicit On

Imports System

Namespace Nexamas.UI.Modules

    ''' <summary>
    ''' Immutable description of one contribution offered by a module.
    ''' </summary>
    ''' <remarks>
    ''' The contribution is metadata only. Pages, commands, settings sections, themes, and tools remain owned by
    ''' their existing MAS systems; this row only records the official route that owns the contribution.
    ''' </remarks>
    Friend NotInheritable Class MASModuleContribution

        Friend Sub New(moduleId As String,
                       kind As MASModuleContributionKind,
                       contributionId As String,
                       displayName As String,
                       ownerSystem As String,
                       routeName As String)
            Me.ModuleId = NormalizeId(moduleId)
            Me.Kind = kind
            Me.ContributionId = NormalizeId(contributionId)
            Me.DisplayName = NormalizeText(displayName)
            Me.OwnerSystem = NormalizeText(ownerSystem)
            Me.RouteName = NormalizeText(routeName)
        End Sub

        Friend ReadOnly Property ModuleId As String
        Friend ReadOnly Property Kind As MASModuleContributionKind
        Friend ReadOnly Property ContributionId As String
        Friend ReadOnly Property DisplayName As String
        Friend ReadOnly Property OwnerSystem As String
        Friend ReadOnly Property RouteName As String

        Friend ReadOnly Property IsValid As Boolean
            Get
                Return ModuleId.Length > 0 AndAlso
                       ContributionId.Length > 0 AndAlso
                       DisplayName.Length > 0 AndAlso
                       OwnerSystem.Length > 0 AndAlso
                       RouteName.Length > 0
            End Get
        End Property

        Friend ReadOnly Property IsCommandRouteOwnedByCommandActionSystem As Boolean
            Get
                If Kind <> MASModuleContributionKind.Command AndAlso Kind <> MASModuleContributionKind.Tool Then Return True

                Return OwnerSystem.IndexOf("CommandActionSystem", StringComparison.OrdinalIgnoreCase) >= 0 AndAlso
                       RouteName.IndexOf("MASCommandRegistry", StringComparison.OrdinalIgnoreCase) >= 0
            End Get
        End Property

        Friend ReadOnly Property Key As String
            Get
                Return ModuleId & "|" & Kind.ToString() & "|" & ContributionId
            End Get
        End Property

        Friend Shared Function NormalizeId(value As String) As String
            Return If(value, String.Empty).Trim()
        End Function

        Friend Shared Function NormalizeText(value As String) As String
            Return If(value, String.Empty).Trim()
        End Function

    End Class

End Namespace
