Option Strict On
Option Explicit On

Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports Nexamas.UI.Components
Imports Nexamas.UI.Controls
Imports Nexamas.UI.Host
Imports Nexamas.UI.Layout
Imports Nexamas.UI.Theming
Imports Nexamas.UI.TextInput
Imports Nexamas.UI.Values
Imports SkiaSharp

Namespace Nexamas.UI.Application

    Partial Public NotInheritable Class MASApplicationWindowControls

        Friend Function CreateValidationMessage(Optional text As String = Nothing,
                                                Optional state As MASTextValidationState = MASTextValidationState.Information,
                                                Optional configure As Action(Of MASValidationMessage) = Nothing) As MASValidationMessage
            Dim control As MASValidationMessage = MASValidationMessage.Create(text)
            control.State = state
            Return ConfigureControl(control, configure)
        End Function

        Public Function AddValidationMessage(Optional text As String = Nothing,
                                             Optional state As MASTextValidationState = MASTextValidationState.Information,
                                             Optional configure As Action(Of MASValidationMessage) = Nothing) As MASValidationMessage
            Return AddCreatedControlInternal(CreateValidationMessage(text, state, configure))
        End Function

        Friend Function CreateFormValidationSummary(Optional title As String = Nothing,
                                                     Optional configure As Action(Of MASFormValidationSummary) = Nothing) As MASFormValidationSummary
            Return ConfigureControl(MASFormValidationSummary.Create(title), configure)
        End Function

        Public Function AddFormValidationSummary(Optional title As String = Nothing,
                                                  Optional configure As Action(Of MASFormValidationSummary) = Nothing) As MASFormValidationSummary
            Return AddCreatedControlInternal(CreateFormValidationSummary(title, configure))
        End Function

        Friend Function CreateCallout(Optional title As String = Nothing,
                                      Optional text As String = Nothing,
                                      Optional configure As Action(Of MASCallout) = Nothing) As MASCallout
            Return ConfigureControl(MASCallout.Create(title, text), configure)
        End Function

        Public Function AddCallout(Optional title As String = Nothing,
                                   Optional text As String = Nothing,
                                   Optional configure As Action(Of MASCallout) = Nothing) As MASCallout
            Return AddCreatedControlInternal(CreateCallout(title, text, configure))
        End Function

        Public Function CreatePopover(Optional title As String = Nothing,
                                      Optional text As String = Nothing,
                                      Optional configure As Action(Of MASPopover) = Nothing) As MASPopover
            Dim popover As New MASPopover(_rootHost)
            popover.Title = MASCalloutVisualPolicy.NormalizeTitle(title)
            popover.Text = MASCalloutVisualPolicy.NormalizeBody(text)
            If configure IsNot Nothing Then configure.Invoke(popover)
            Return popover
        End Function

        Public Function CreateDrawer(Optional title As String = Nothing,
                                     Optional side As MASDrawerSide = MASDrawerSide.Right,
                                     Optional configure As Action(Of MASDrawer) = Nothing) As MASDrawer
            Dim drawer As New MASDrawer(_rootHost, title)
            drawer.Side = side
            If configure IsNot Nothing Then configure.Invoke(drawer)
            Return drawer
        End Function

        Friend Function CreateBadge(Optional text As String = Nothing,
                                    Optional tone As MASToastTone = MASToastTone.Neutral,
                                    Optional configure As Action(Of MASBadge) = Nothing) As MASBadge
            Return ConfigureControl(MASBadge.Create(text, tone), configure)
        End Function

        Public Function AddBadge(Optional text As String = Nothing,
                                 Optional tone As MASToastTone = MASToastTone.Neutral,
                                 Optional configure As Action(Of MASBadge) = Nothing) As MASBadge
            Return AddCreatedControlInternal(CreateBadge(text, tone, configure))
        End Function

        Friend Function CreateStatusBanner(Optional title As String = Nothing,
                                           Optional message As String = Nothing,
                                           Optional tone As MASToastTone = MASToastTone.Info,
                                           Optional configure As Action(Of MASStatusBanner) = Nothing) As MASStatusBanner
            Return ConfigureControl(MASStatusBanner.Create(title, message, tone), configure)
        End Function

        Public Function AddStatusBanner(Optional title As String = Nothing,
                                        Optional message As String = Nothing,
                                        Optional tone As MASToastTone = MASToastTone.Info,
                                        Optional configure As Action(Of MASStatusBanner) = Nothing) As MASStatusBanner
            Return AddCreatedControlInternal(CreateStatusBanner(title, message, tone, configure))
        End Function

        Friend Function CreateNotificationPanel(Optional title As String = Nothing,
                                                Optional configure As Action(Of MASNotificationPanel) = Nothing) As MASNotificationPanel
            Return ConfigureControl(MASNotificationPanel.Create(title), configure)
        End Function

        Public Function AddNotificationPanel(Optional title As String = Nothing,
                                             Optional configure As Action(Of MASNotificationPanel) = Nothing) As MASNotificationPanel
            Return AddCreatedControlInternal(CreateNotificationPanel(title, configure))
        End Function

        Friend Function CreateEmptyState(Optional title As String = Nothing,
                                         Optional description As String = Nothing,
                                         Optional configure As Action(Of MASEmptyState) = Nothing) As MASEmptyState
            Return ConfigureControl(MASEmptyState.Create(title, description), configure)
        End Function

        Public Function AddEmptyState(Optional title As String = Nothing,
                                      Optional description As String = Nothing,
                                      Optional configure As Action(Of MASEmptyState) = Nothing) As MASEmptyState
            Return AddCreatedControlInternal(CreateEmptyState(title, description, configure))
        End Function

        Friend Function CreateLoadingSkeleton(Optional rowCount As Integer = 4,
                                              Optional configure As Action(Of MASLoadingSkeleton) = Nothing) As MASLoadingSkeleton
            Return ConfigureControl(MASLoadingSkeleton.Create(rowCount), configure)
        End Function

        Public Function AddLoadingSkeleton(Optional rowCount As Integer = 4,
                                           Optional configure As Action(Of MASLoadingSkeleton) = Nothing) As MASLoadingSkeleton
            Return AddCreatedControlInternal(CreateLoadingSkeleton(rowCount, configure))
        End Function

        Friend Function CreateAvatar(Optional displayName As String = Nothing,
                                     Optional initials As String = Nothing,
                                     Optional configure As Action(Of MASAvatar) = Nothing) As MASAvatar
            Return ConfigureControl(MASAvatar.Create(displayName, initials), configure)
        End Function

        Public Function AddAvatar(Optional displayName As String = Nothing,
                                  Optional initials As String = Nothing,
                                  Optional configure As Action(Of MASAvatar) = Nothing) As MASAvatar
            Return AddCreatedControlInternal(CreateAvatar(displayName, initials, configure))
        End Function

        Friend Function CreateAvatarGroup(Optional avatars As IEnumerable(Of MASAvatar) = Nothing,
                                          Optional configure As Action(Of MASAvatarGroup) = Nothing) As MASAvatarGroup
            Return ConfigureControl(MASAvatarGroup.Create(avatars), configure)
        End Function

        Public Function AddAvatarGroup(Optional avatars As IEnumerable(Of MASAvatar) = Nothing,
                                       Optional configure As Action(Of MASAvatarGroup) = Nothing) As MASAvatarGroup
            Return AddCreatedControlInternal(CreateAvatarGroup(avatars, configure))
        End Function

        Friend Function CreateMetricCard(Optional title As String = Nothing,
                                         Optional valueText As String = Nothing,
                                         Optional configure As Action(Of MASMetricCard) = Nothing) As MASMetricCard
            Return ConfigureControl(MASMetricCard.Create(title, valueText), configure)
        End Function

        Public Function AddMetricCard(Optional title As String = Nothing,
                                      Optional valueText As String = Nothing,
                                      Optional configure As Action(Of MASMetricCard) = Nothing) As MASMetricCard
            Return AddCreatedControlInternal(CreateMetricCard(title, valueText, configure))
        End Function

        Friend Function CreateTimeline(Optional title As String = Nothing,
                                      Optional description As String = Nothing,
                                      Optional configure As Action(Of MASTimeline) = Nothing) As MASTimeline
            Return ConfigureControl(MASTimeline.Create(title, description), configure)
        End Function

        Public Function AddTimeline(Optional title As String = Nothing,
                                   Optional description As String = Nothing,
                                   Optional configure As Action(Of MASTimeline) = Nothing) As MASTimeline
            Return AddCreatedControlInternal(CreateTimeline(title, description, configure))
        End Function

        Friend Function CreateOperationProgressBox(Optional titleText As String = Nothing,
                                                   Optional statusText As String = Nothing,
                                                   Optional configure As Action(Of MASOperationProgressBox) = Nothing) As MASOperationProgressBox
            Return ConfigureControl(MASOperationProgressBox.Create(titleText, statusText), configure)
        End Function

        Public Function AddOperationProgressBox(Optional titleText As String = Nothing,
                                                Optional statusText As String = Nothing,
                                                Optional configure As Action(Of MASOperationProgressBox) = Nothing) As MASOperationProgressBox
            Return AddCreatedControlInternal(CreateOperationProgressBox(titleText, statusText, configure))
        End Function

        Friend Function CreateProgressBar(Optional configure As Action(Of MASProgressBar) = Nothing) As MASProgressBar
            Return ConfigureControl(MASProgressBar.Create(), configure)
        End Function

        Public Function AddProgressBar(Optional configure As Action(Of MASProgressBar) = Nothing) As MASProgressBar
            Return AddCreatedControlInternal(CreateProgressBar(configure))
        End Function
    End Class

End Namespace
