Option Strict On
Option Explicit On

Imports System
Imports System.Collections.Generic
Imports Nexamas.UI.Controls
Imports Nexamas.UI.Layout

Namespace Nexamas.UI.Composition

    ''' <summary>
    ''' Public details-section description for Phase 2.5 value templates.
    ''' A details section groups a title, optional description, and read-oriented details rows.
    ''' It owns no rendering, validation, data binding, input routing, overlay lifecycle, scroll runtime, Theme state, or Host lifecycle.
    ''' </summary>
    <Global.System.ComponentModel.EditorBrowsable(Global.System.ComponentModel.EditorBrowsableState.Advanced)>
    Friend NotInheritable Class MASDetailsSection

        Friend ReadOnly Property Title As MASControlBase
        Friend ReadOnly Property Description As MASControlBase
        Friend ReadOnly Property Rows As IReadOnlyList(Of MASDetailsRow)
        Friend ReadOnly Property Spacing As Single
        Friend ReadOnly Property Padding As MASLayoutThickness
        Friend ReadOnly Property Margin As MASLayoutThickness
        Friend ReadOnly Property Key As String
        Friend ReadOnly Property UseDefaultVisualPolish As Boolean

        Friend Sub New(title As MASControlBase,
                       rows As IEnumerable(Of MASDetailsRow),
                       Optional description As MASControlBase = Nothing,
                       Optional spacing As Single = MASCompositionSectionSizeTokens.DetailsSpacing,
                       Optional padding As MASLayoutThickness = Nothing,
                       Optional margin As MASLayoutThickness = Nothing,
                       Optional key As String = "",
                       Optional useDefaultVisualPolish As Boolean = True)

            Me.Title = title
            Me.Description = description
            Me.Rows = NormalizeRows(rows)
            Me.Spacing = SafeSpacing(spacing)
            Me.Padding = padding
            Me.Margin = margin
            Me.Key = If(key, String.Empty)
            Me.UseDefaultVisualPolish = useDefaultVisualPolish
        End Sub

        Friend Function ToLayoutItem() As MASLayoutItem
            Dim items As New List(Of MASLayoutItem)()

            If Title IsNot Nothing Then
                items.Add(
                    MASComposition.Item(
                        control:=Title,
                        width:=MASSizePolicy.Fill(1.0F),
                        height:=MASSizePolicy.Auto(),
                        alignment:=MASLayoutAlignment.Stretch)
                )
            End If

            If Description IsNot Nothing Then
                items.Add(
                    MASComposition.Item(
                        control:=Description,
                        width:=MASSizePolicy.Fill(1.0F),
                        height:=MASSizePolicy.Auto(),
                        alignment:=MASLayoutAlignment.Stretch)
                )
            End If

            For Each row As MASDetailsRow In Rows
                If row IsNot Nothing Then
                    items.Add(row.ToLayoutItem())
                End If
            Next

            Dim sectionNode As IMASLayoutNode =
                MASComposition.Vertical(
                    children:=items.ToArray(),
                    spacing:=Spacing,
                    padding:=ResolveSectionPadding(Padding, UseDefaultVisualPolish),
                    alignment:=MASLayoutAlignment.Stretch)

            Return MASComposition.NodeItem(
                node:=sectionNode,
                width:=MASSizePolicy.Fill(1.0F),
                height:=MASSizePolicy.Auto(),
                alignment:=MASLayoutAlignment.Stretch,
                margin:=ResolveSectionMargin(Margin, UseDefaultVisualPolish),
                key:=Key)
        End Function

        Private Shared Function NormalizeRows(rows As IEnumerable(Of MASDetailsRow)) As IReadOnlyList(Of MASDetailsRow)
            Dim result As New List(Of MASDetailsRow)()

            If rows IsNot Nothing Then
                For Each row As MASDetailsRow In rows
                    If row IsNot Nothing Then
                        result.Add(row)
                    End If
                Next
            End If

            Return result.AsReadOnly()
        End Function

        Private Shared Function ResolveSectionPadding(value As MASLayoutThickness, useDefaultVisualPolish As Boolean) As MASLayoutThickness
            If useDefaultVisualPolish AndAlso MASCompositionSectionSizeTokens.IsEmptyThickness(value) Then
                Return MASCompositionSectionSizeTokens.DetailsPadding()
            End If

            Return value
        End Function

        Private Shared Function ResolveSectionMargin(value As MASLayoutThickness, useDefaultVisualPolish As Boolean) As MASLayoutThickness
            If useDefaultVisualPolish AndAlso MASCompositionSectionSizeTokens.IsEmptyThickness(value) Then
                Return MASCompositionSectionSizeTokens.DetailsMargin()
            End If

            Return value
        End Function

        Private Shared Function SafeSpacing(value As Single) As Single
            Return MASCompositionSectionSizeTokens.SafeSpacing(value)
        End Function

    End Class

End Namespace
