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 CreateFilterBuilder(Optional rules As IEnumerable(Of MASFilterRule) = Nothing,
                                           Optional configure As Action(Of MASFilterBuilder) = Nothing) As MASFilterBuilder
            Return ConfigureControl(MASFilterBuilder.Create(rules), configure)
        End Function

        Public Function AddFilterBuilder(Optional rules As IEnumerable(Of MASFilterRule) = Nothing,
                                         Optional configure As Action(Of MASFilterBuilder) = Nothing) As MASFilterBuilder
            Return AddCreatedControlInternal(CreateFilterBuilder(rules, configure))
        End Function

        Friend Function CreateAppliedFiltersBar(Optional title As String = Nothing,
                                                Optional savedViewName As String = Nothing,
                                                Optional configure As Action(Of MASAppliedFiltersBar) = Nothing) As MASAppliedFiltersBar
            Return ConfigureControl(MASAppliedFiltersBar.Create(title, savedViewName), configure)
        End Function

        Public Function AddAppliedFiltersBar(Optional title As String = Nothing,
                                             Optional savedViewName As String = Nothing,
                                             Optional configure As Action(Of MASAppliedFiltersBar) = Nothing) As MASAppliedFiltersBar
            Return AddCreatedControlInternal(CreateAppliedFiltersBar(title, savedViewName, configure))
        End Function

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

        Public Function AddKanbanBoard(Optional title As String = Nothing,
                                       Optional configure As Action(Of MASKanbanBoard) = Nothing) As MASKanbanBoard
            Return AddCreatedControlInternal(CreateKanbanBoard(title, configure))
        End Function

        Friend Function CreateAgendaView(Optional title As String = Nothing,
                                         Optional day As Nullable(Of Date) = Nothing,
                                         Optional configure As Action(Of MASAgendaView) = Nothing) As MASAgendaView
            Return ConfigureControl(MASAgendaView.Create(title, day), configure)
        End Function

        Public Function AddAgendaView(Optional title As String = Nothing,
                                      Optional day As Nullable(Of Date) = Nothing,
                                      Optional configure As Action(Of MASAgendaView) = Nothing) As MASAgendaView
            Return AddCreatedControlInternal(CreateAgendaView(title, day, configure))
        End Function

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

        Public Function AddTreeGrid(Optional title As String = Nothing,
                                    Optional configure As Action(Of MASTreeGrid) = Nothing) As MASTreeGrid
            Return AddCreatedControlInternal(CreateTreeGrid(title, configure))
        End Function

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

        Public Function AddPivotTable(Optional title As String = Nothing,
                                      Optional configure As Action(Of MASPivotTable) = Nothing) As MASPivotTable
            Return AddCreatedControlInternal(CreatePivotTable(title, configure))
        End Function

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

        Public Function AddDashboardGrid(Optional title As String = Nothing,
                                          Optional configure As Action(Of MASDashboardGrid) = Nothing) As MASDashboardGrid
            Return AddCreatedControlInternal(CreateDashboardGrid(title, configure))
        End Function

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

        Public Function AddMasterDetailView(Optional title As String = Nothing,
                                            Optional configure As Action(Of MASMasterDetailView) = Nothing) As MASMasterDetailView
            Return AddCreatedControlInternal(CreateMasterDetailView(title, configure))
        End Function

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

        Public Function AddChartLegend(Optional title As String = Nothing,
                                       Optional configure As Action(Of MASChartLegend) = Nothing) As MASChartLegend
            Return AddCreatedControlInternal(CreateChartLegend(title, configure))
        End Function

        Friend Function CreateDataGrid(Optional configure As Action(Of MASDataGrid) = Nothing) As MASDataGrid
            Return ConfigureControl(New MASDataGrid(), configure)
        End Function

        Public Function AddDataGrid(Optional configure As Action(Of MASDataGrid) = Nothing) As MASDataGrid
            Return AddCreatedControlInternal(CreateDataGrid(configure))
        End Function

        Friend Function CreateDataForm(Optional configure As Action(Of MASFormBuilder) = Nothing,
                                      Optional configureDataForm As Action(Of MASDataForm) = Nothing) As MASDataForm
            Return ConfigureControl(MASDataForm.Create(configure), configureDataForm)
        End Function

        Public Function AddDataForm(Optional configure As Action(Of MASFormBuilder) = Nothing,
                                   Optional configureControl As Action(Of MASDataForm) = Nothing) As MASDataForm
            Return AddCreatedControlInternal(CreateDataForm(configure, configureControl))
        End Function

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

        Public Function AddChart(Optional configure As Action(Of MASChart) = Nothing) As MASChart
            Return AddCreatedControlInternal(CreateChart(configure))
        End Function

        Friend Function CreateListBox(Optional items As IEnumerable(Of String) = Nothing,
                                      Optional configure As Action(Of MASListBox) = Nothing) As MASListBox
            Dim control As MASListBox = MASListBox.Create()
            If items IsNot Nothing Then control.AddItems(items)
            Return ConfigureControl(control, configure)
        End Function

        Public Function AddListBox(Optional items As IEnumerable(Of String) = Nothing,
                                   Optional configure As Action(Of MASListBox) = Nothing) As MASListBox
            Return AddCreatedControlInternal(CreateListBox(items, configure))
        End Function

        Friend Function CreateListView(Optional textItems As IEnumerable(Of String) = Nothing,
                                       Optional configure As Action(Of MASListView) = Nothing) As MASListView
            Dim control As MASListView = MASListView.Create()
            If textItems IsNot Nothing Then control.AddTextRange(textItems)
            Return ConfigureControl(control, configure)
        End Function

        Public Function AddListView(Optional textItems As IEnumerable(Of String) = Nothing,
                                    Optional configure As Action(Of MASListView) = Nothing) As MASListView
            Return AddCreatedControlInternal(CreateListView(textItems, configure))
        End Function

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

        Public Function AddTreeView(Optional configure As Action(Of MASTreeView) = Nothing) As MASTreeView
            Return AddCreatedControlInternal(CreateTreeView(configure))
        End Function
    End Class

End Namespace
