Option Strict On
Option Explicit On

Imports System

Namespace Nexamas.UI.Theming

    ''' <summary>
    ''' Builds the two-layer immutable theme composition from foundation and family factories.
    ''' </summary>
    ''' <remarks>
    ''' Foundation is created first. Families are then derived from the completed foundation.
    ''' This preserves a single composition path for all concrete application themes.
    ''' </remarks>
    Friend NotInheritable Class ThemeAssembly

        Private ReadOnly _foundation As IMASThemeFoundation
        Private ReadOnly _families As IMASThemeFamilies

        Private Sub New(foundation As IMASThemeFoundation, families As IMASThemeFamilies)
            If foundation Is Nothing Then
                Throw New ArgumentNullException(NameOf(foundation))
            End If

            If families Is Nothing Then
                Throw New ArgumentNullException(NameOf(families))
            End If

            _foundation = foundation
            _families = families
        End Sub

        Friend ReadOnly Property Foundation As IMASThemeFoundation
            Get
                Return _foundation
            End Get
        End Property

        Friend ReadOnly Property Families As IMASThemeFamilies
            Get
                Return _families
            End Get
        End Property

        Friend Shared Function Build(foundationFactory As IThemeFoundationFactory,
                                     familyFactory As IThemeFamilyFactory) As ThemeAssembly

            If foundationFactory Is Nothing Then
                Throw New ArgumentNullException(NameOf(foundationFactory))
            End If

            If familyFactory Is Nothing Then
                Throw New ArgumentNullException(NameOf(familyFactory))
            End If

            Dim foundation As IMASThemeFoundation = foundationFactory.BuildFoundation()
            Dim families As IMASThemeFamilies = familyFactory.BuildFamilies(foundation)

            Return New ThemeAssembly(foundation, families)
        End Function

    End Class

End Namespace