Option Strict On
Option Explicit On

Imports System
Imports Nexamas.UI.Layout

Namespace Nexamas.UI.Application

    ''' <summary>
    ''' Internal Application-settings layout policy. It centralizes the owned Settings page spacing,
    ''' padding, chrome reservation, max-content width, and compact-row choices so Application pages
    ''' consume MASLayout vocabulary instead of public raw-number options.
    ''' </summary>
    Friend NotInheritable Class MASApplicationSettingsLayoutPolicy
        Private Sub New()
        End Sub

        Friend Shared Sub ConfigureSettingsPage(page As MASApplicationLayoutPageBuilder,
                                                options As MASApplicationSettingsPageOptions)
            If page Is Nothing Then Throw New ArgumentNullException(NameOf(page))

            Dim effectiveOptions As MASApplicationSettingsPageOptions = MASApplicationSettingsPageOptions.Normalize(options)
            page.Padding(ResolvePagePadding(effectiveOptions)) _
                .Spacing(MASLayoutSpacing.Small) _
                .MaxContentWidth(MASApplicationLayoutSizeTokens.SettingsPageMaxContentWidth)
        End Sub

        Friend Shared Function SectionGap(options As MASApplicationSettingsPageOptions) As MASLayoutSpacing
            Return MASLayoutSpacing.Tight
        End Function

        Friend Shared Function ActionGap(options As MASApplicationSettingsPageOptions) As MASLayoutSpacing
            Return MASLayoutSpacing.Small
        End Function

        Friend Shared Function PreviewGap(options As MASApplicationSettingsPageOptions) As MASLayoutSpacing
            Return MASLayoutSpacing.Tight
        End Function

        <Global.System.Obsolete("Application Settings now uses DefaultActionIntent so settings actions follow the unified element-size contract.", False),
         Global.System.ComponentModel.EditorBrowsable(Global.System.ComponentModel.EditorBrowsableState.Never)>
        Friend Shared Function CompactIntent() As MASSize
            Return DefaultActionIntent()
        End Function

        Friend Shared Function DefaultActionIntent() As MASSize
            Return MASSize.[Default]
        End Function

        Private Shared Function ResolvePagePadding(options As MASApplicationSettingsPageOptions) As MASLayoutInset
            Dim basePadding As MASLayoutInset = MASLayoutSpacingResolver.ResolveInsetBase(MASLayoutSpacing.Large)
            Dim topInset As Single = SafeNonNegative(options.ChromeTopInsetLogical) + basePadding.Top
            Return New MASLayoutInset(basePadding.Left, topInset, basePadding.Right, basePadding.Bottom)
        End Function

        Private Shared Function SafeNonNegative(value As Single) As Single
            If Single.IsNaN(value) OrElse Single.IsInfinity(value) OrElse value < 0.0F Then Return 0.0F
            Return value
        End Function

    End Class

End Namespace
