Option Strict On
Option Explicit On

Imports System.Collections.Generic
Imports System.Linq

Namespace Nexamas.UI.Localization

    ''' <summary>
    ''' Immutable Phase 6 product-layer snapshot for localization and RTL readiness.
    ''' Public consumers read the collection facts; derived proof/count convenience members are Friend-owned.
    ''' </summary>
    ''' <remarks>
    ''' The snapshot is descriptive only. It does not mutate controls, change thread culture,
    ''' create UI, draw text, or perform file/resource IO. It gives future product and external consumer
    ''' layers one official read model for culture, direction, formatting, and string expansion facts.
    ''' </remarks>
    Friend NotInheritable Class MASLocalizationSnapshot
        Friend Sub New(contractVersion As Integer,
                       cultures As IEnumerable(Of MASLocalizationCultureEntry),
                       localizedStrings As IEnumerable(Of MASLocalizationStringEntry),
                       formatSamples As IEnumerable(Of MASLocalizationFormatSample),
                       expansionSamples As IEnumerable(Of MASLocalizationExpansionSample))
            Me.ContractVersion = contractVersion
            Me.Cultures = CopyCultures(cultures)
            Me.LocalizedStrings = CopyStrings(localizedStrings)
            Me.FormatSamples = CopyFormatSamples(formatSamples)
            Me.ExpansionSamples = CopyExpansionSamples(expansionSamples)
        End Sub

        Friend ReadOnly Property ContractVersion As Integer
        Friend ReadOnly Property Cultures As IReadOnlyList(Of MASLocalizationCultureEntry)
        Friend ReadOnly Property LocalizedStrings As IReadOnlyList(Of MASLocalizationStringEntry)
        Friend ReadOnly Property FormatSamples As IReadOnlyList(Of MASLocalizationFormatSample)
        Friend ReadOnly Property ExpansionSamples As IReadOnlyList(Of MASLocalizationExpansionSample)

        Friend ReadOnly Property CultureCount As Integer
            Get
                Return Cultures.Count
            End Get
        End Property

        Friend ReadOnly Property LocalizedStringCount As Integer
            Get
                Return LocalizedStrings.Count
            End Get
        End Property

        Friend ReadOnly Property FormatSampleCount As Integer
            Get
                Return FormatSamples.Count
            End Get
        End Property

        Friend ReadOnly Property ExpansionSampleCount As Integer
            Get
                Return ExpansionSamples.Count
            End Get
        End Property

        Friend ReadOnly Property HasRightToLeftCulture As Boolean
            Get
                Return Cultures.Any(Function(culture) culture IsNot Nothing AndAlso culture.IsRightToLeft)
            End Get
        End Property

        Friend ReadOnly Property HasMirroredLayoutCulture As Boolean
            Get
                Return Cultures.Any(Function(culture) culture IsNot Nothing AndAlso culture.UsesMirroredLayout)
            End Get
        End Property

        Friend ReadOnly Property ReadyForProductLayer As Boolean
            Get
                Return ContractVersion = MASLocalizationContractVersion.Current AndAlso
                       CultureCount >= 3 AndAlso
                       LocalizedStringCount >= 3 AndAlso
                       FormatSampleCount >= CultureCount AndAlso
                       ExpansionSampleCount >= 3 AndAlso
                       HasRightToLeftCulture AndAlso
                       HasMirroredLayoutCulture AndAlso
                       LocalizedStrings.All(Function(entry) entry IsNot Nothing AndAlso entry.IsComplete) AndAlso
                       FormatSamples.All(Function(sample) sample IsNot Nothing AndAlso sample.IsComplete)
            End Get
        End Property

        Private Shared Function CopyCultures(items As IEnumerable(Of MASLocalizationCultureEntry)) As IReadOnlyList(Of MASLocalizationCultureEntry)
            Dim list As New List(Of MASLocalizationCultureEntry)()
            If items IsNot Nothing Then list.AddRange(items)
            Return list.AsReadOnly()
        End Function

        Private Shared Function CopyStrings(items As IEnumerable(Of MASLocalizationStringEntry)) As IReadOnlyList(Of MASLocalizationStringEntry)
            Dim list As New List(Of MASLocalizationStringEntry)()
            If items IsNot Nothing Then list.AddRange(items)
            Return list.AsReadOnly()
        End Function

        Private Shared Function CopyFormatSamples(items As IEnumerable(Of MASLocalizationFormatSample)) As IReadOnlyList(Of MASLocalizationFormatSample)
            Dim list As New List(Of MASLocalizationFormatSample)()
            If items IsNot Nothing Then list.AddRange(items)
            Return list.AsReadOnly()
        End Function

        Private Shared Function CopyExpansionSamples(items As IEnumerable(Of MASLocalizationExpansionSample)) As IReadOnlyList(Of MASLocalizationExpansionSample)
            Dim list As New List(Of MASLocalizationExpansionSample)()
            If items IsNot Nothing Then list.AddRange(items)
            Return list.AsReadOnly()
        End Function
    End Class

End Namespace
