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>
    ' Wizard page recipe family for the MASPage public facade.
    ' </summary>
    Partial Friend NotInheritable Class MASPage

        ''' <summary>
        ''' Creates a neutral wizard step page.
        ''' WizardPage presents one step only; the host application owns navigation state and Back/Next behavior.
        ''' It does not create a navigation runtime, open overlays, own input routing, own scroll runtime, own Theme state, or own Host lifecycle.
        ''' </summary>
        Public Shared Function WizardPage(stepTitle As MASControlBase,
                                          Optional stepDescription As MASControlBase = Nothing,
                                          Optional content As IMASLayoutNode = Nothing,
                                          Optional actions As IMASLayoutNode = Nothing,
                                          Optional progress As MASControlBase = Nothing,
                                          Optional spacing As Single = MASCompositionPageSizeTokens.WizardPageSpacing,
                                          Optional padding As MASLayoutThickness = Nothing,
                                          Optional titleHeight As MASSizePolicy = Nothing,
                                          Optional descriptionHeight As MASSizePolicy = Nothing,
                                          Optional contentHeight As MASSizePolicy = Nothing,
                                          Optional actionsWidth As MASSizePolicy = Nothing,
                                          Optional actionsHeight As MASSizePolicy = Nothing,
                                          Optional maxContentWidth As Single = MASCompositionPageSizeTokens.WizardMaxContentWidth,
                                          Optional scrollEnabled As Boolean = True,
                                          Optional scrollKey As String = "",
                                          Optional useDefaultVisualPolish As Boolean = True) As IMASLayoutNode

            Dim pageItems As New List(Of MASLayoutItem)()

            If progress IsNot Nothing Then
                pageItems.Add(
                    MASComposition.Item(
                        control:=progress,
                        width:=MASSizePolicy.Fill(1.0F),
                        height:=MASSizePolicy.Auto(),
                        alignment:=MASLayoutAlignment.Stretch,
                        margin:=ResolveWizardProgressMargin(useDefaultVisualPolish))
                )
            End If

            If stepTitle IsNot Nothing Then
                pageItems.Add(
                    MASComposition.Item(
                        control:=stepTitle,
                        width:=MASSizePolicy.Fill(1.0F),
                        height:=If(titleHeight, MASSizePolicy.Auto()),
                        alignment:=MASLayoutAlignment.Stretch,
                        margin:=ResolveFormTitleMargin(useDefaultVisualPolish))
                )
            End If

            If stepDescription IsNot Nothing Then
                pageItems.Add(
                    MASComposition.Item(
                        control:=stepDescription,
                        width:=MASSizePolicy.Fill(1.0F),
                        height:=If(descriptionHeight, MASSizePolicy.Auto()),
                        alignment:=MASLayoutAlignment.Stretch,
                        margin:=ResolveFormDescriptionMargin(useDefaultVisualPolish))
                )
            End If

            If content IsNot Nothing Then
                pageItems.Add(
                    MASComposition.NodeItem(
                        node:=content,
                        width:=MASSizePolicy.Fill(1.0F),
                        height:=If(contentHeight, MASSizePolicy.Fill(1.0F)),
                        alignment:=MASLayoutAlignment.Stretch)
                )
            End If

            If actions IsNot Nothing Then
                pageItems.Add(
                    MASComposition.NodeItem(
                        node:=actions,
                        width:=If(actionsWidth, MASSizePolicy.Auto()),
                        height:=If(actionsHeight, MASSizePolicy.Auto()),
                        alignment:=MASLayoutAlignment.End,
                        margin:=ResolveFormActionsMargin(useDefaultVisualPolish))
                )
            End If

            Dim pageNode As IMASLayoutNode =
                MASComposition.Vertical(
                    children:=pageItems.ToArray(),
                    spacing:=SafeSpacing(spacing),
                    padding:=ResolveWizardPagePadding(padding, useDefaultVisualPolish),
                    alignment:=MASLayoutAlignment.Stretch)

            Return WrapScrollableOrMaxContentWidth(
                node:=pageNode,
                maxContentWidth:=maxContentWidth,
                scrollEnabled:=scrollEnabled,
                scrollKey:=scrollKey)
        End Function

        ''' <summary>
        ''' Creates a neutral wizard step page with a single control as content.
        ''' </summary>
        Public Shared Function WizardPage(stepTitle As MASControlBase,
                                          stepDescription As MASControlBase,
                                          content As MASControlBase,
                                          Optional actions As IMASLayoutNode = Nothing,
                                          Optional progress As MASControlBase = Nothing,
                                          Optional spacing As Single = MASCompositionPageSizeTokens.WizardPageSpacing,
                                          Optional padding As MASLayoutThickness = Nothing,
                                          Optional titleHeight As MASSizePolicy = Nothing,
                                          Optional descriptionHeight As MASSizePolicy = Nothing,
                                          Optional contentHeight As MASSizePolicy = Nothing,
                                          Optional actionsWidth As MASSizePolicy = Nothing,
                                          Optional actionsHeight As MASSizePolicy = Nothing,
                                          Optional maxContentWidth As Single = MASCompositionPageSizeTokens.WizardMaxContentWidth,
                                          Optional scrollEnabled As Boolean = True,
                                          Optional scrollKey As String = "",
                                          Optional useDefaultVisualPolish As Boolean = True) As IMASLayoutNode

            Dim contentNode As IMASLayoutNode = Nothing

            If content IsNot Nothing Then
                contentNode = MASComposition.Vertical(
                    children:=New MASLayoutItem() {
                        MASComposition.Item(
                            control:=content,
                            width:=MASSizePolicy.Fill(1.0F),
                            height:=If(contentHeight, MASSizePolicy.Fill(1.0F)),
                            alignment:=MASLayoutAlignment.Stretch)
                    },
                    spacing:=0.0F,
                    padding:=MASLayoutThickness.None(),
                    alignment:=MASLayoutAlignment.Stretch)
            End If

            Return WizardPage(
                stepTitle:=stepTitle,
                stepDescription:=stepDescription,
                content:=contentNode,
                actions:=actions,
                progress:=progress,
                spacing:=spacing,
                padding:=padding,
                titleHeight:=titleHeight,
                descriptionHeight:=descriptionHeight,
                contentHeight:=contentHeight,
                actionsWidth:=actionsWidth,
                actionsHeight:=actionsHeight,
                maxContentWidth:=maxContentWidth,
                scrollEnabled:=scrollEnabled,
                scrollKey:=scrollKey,
                useDefaultVisualPolish:=useDefaultVisualPolish)
        End Function

        ''' <summary>
        ''' Creates the standard wizard navigation actions row. The application still owns each button action.
        ''' </summary>
        Public Shared Function WizardActionsRow(nextButton As MASControlBase,
                                                Optional backButton As MASControlBase = Nothing,
                                                Optional cancelButton As MASControlBase = Nothing,
                                                Optional spacing As Single = DEFAULT_FORM_ACTIONS_SPACING,
                                                Optional padding As MASLayoutThickness = Nothing,
                                                Optional key As String = "",
                                                Optional useDefaultVisualPolish As Boolean = True) As IMASLayoutNode

            Dim controls As New List(Of MASControlBase)()

            If cancelButton IsNot Nothing Then controls.Add(cancelButton)
            If backButton IsNot Nothing Then controls.Add(backButton)
            If nextButton IsNot Nothing Then controls.Add(nextButton)

            Return ActionsRow(
                controls:=controls.ToArray(),
                spacing:=spacing,
                padding:=padding,
                key:=key,
                useDefaultVisualPolish:=useDefaultVisualPolish)
        End Function

    End Class

End Namespace
