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 CreateComboBox(Optional items As IEnumerable(Of String) = Nothing,
                                       Optional selectedIndex As Integer = -1,
                                       Optional configure As Action(Of MASComboBox) = Nothing) As MASComboBox
            Dim control As MASComboBox = MASComboBox.Create()
            If items IsNot Nothing Then control.SetItems(items)
            If selectedIndex >= 0 Then control.SelectIndex(selectedIndex)
            Return ConfigureControl(control, configure)
        End Function

        Public Function AddComboBox(Optional items As IEnumerable(Of String) = Nothing,
                                    Optional selectedIndex As Integer = -1,
                                    Optional configure As Action(Of MASComboBox) = Nothing) As MASComboBox
            Return AddCreatedControlInternal(CreateComboBox(items, selectedIndex, configure))
        End Function

        Friend Function CreateDatePicker(Optional selectedDate As Nullable(Of Date) = Nothing,
                                        Optional configure As Action(Of MASDatePicker) = Nothing) As MASDatePicker
            Dim control As MASDatePicker = MASDatePicker.Create()
            If selectedDate.HasValue Then control.SelectedDate = selectedDate
            Return ConfigureControl(control, configure)
        End Function

        Public Function AddDatePicker(Optional selectedDate As Nullable(Of Date) = Nothing,
                                      Optional configure As Action(Of MASDatePicker) = Nothing) As MASDatePicker
            Return AddCreatedControlInternal(CreateDatePicker(selectedDate, configure))
        End Function

        Friend Function CreateDateRangePicker(Optional startDate As Nullable(Of Date) = Nothing,
                                             Optional endDate As Nullable(Of Date) = Nothing,
                                             Optional configure As Action(Of MASDateRangePicker) = Nothing) As MASDateRangePicker
            Dim control As MASDateRangePicker = MASDateRangePicker.Create(startDate, endDate)
            Return ConfigureControl(control, configure)
        End Function

        Public Function AddDateRangePicker(Optional startDate As Nullable(Of Date) = Nothing,
                                           Optional endDate As Nullable(Of Date) = Nothing,
                                           Optional configure As Action(Of MASDateRangePicker) = Nothing) As MASDateRangePicker
            Return AddCreatedControlInternal(CreateDateRangePicker(startDate, endDate, configure))
        End Function

        Friend Function CreateTimePicker(Optional selectedTime As Nullable(Of TimeSpan) = Nothing,
                                        Optional configure As Action(Of MASTimePicker) = Nothing) As MASTimePicker
            Dim control As MASTimePicker = MASTimePicker.Create()
            If selectedTime.HasValue Then control.SelectedTime = selectedTime
            Return ConfigureControl(control, configure)
        End Function

        Public Function AddTimePicker(Optional selectedTime As Nullable(Of TimeSpan) = Nothing,
                                      Optional configure As Action(Of MASTimePicker) = Nothing) As MASTimePicker
            Return AddCreatedControlInternal(CreateTimePicker(selectedTime, configure))
        End Function

        Friend Function CreateTagInput(Optional tags As IEnumerable(Of String) = Nothing,
                                      Optional configure As Action(Of MASTagInput) = Nothing) As MASTagInput
            Return ConfigureControl(MASTagInput.Create(tags), configure)
        End Function

        Public Function AddTagInput(Optional tags As IEnumerable(Of String) = Nothing,
                                   Optional configure As Action(Of MASTagInput) = Nothing) As MASTagInput
            Return AddCreatedControlInternal(CreateTagInput(tags, configure))
        End Function

        Friend Function CreateSlider(Optional minimum As Double = 0.0,
                                     Optional maximum As Double = 100.0,
                                     Optional value As Double = 0.0,
                                     Optional configure As Action(Of MASSlider) = Nothing) As MASSlider
            Return ConfigureControl(MASSlider.Create(minimum, maximum, value), configure)
        End Function

        Public Function AddSlider(Optional minimum As Double = 0.0,
                                  Optional maximum As Double = 100.0,
                                  Optional value As Double = 0.0,
                                  Optional configure As Action(Of MASSlider) = Nothing) As MASSlider
            Return AddCreatedControlInternal(CreateSlider(minimum, maximum, value, configure))
        End Function

        Friend Function CreateTextBox(Optional text As String = Nothing,
                                      Optional configure As Action(Of MASTextBox) = Nothing) As MASTextBox
            Return ConfigureControl(MASTextBox.Create(text), configure)
        End Function

        Public Function AddTextBox(Optional text As String = Nothing,
                                   Optional configure As Action(Of MASTextBox) = Nothing) As MASTextBox
            Return AddCreatedControlInternal(CreateTextBox(text, configure))
        End Function

        Friend Function CreateMultilineTextBox(Optional text As String = Nothing,
                                               Optional configure As Action(Of MASMultilineTextBox) = Nothing) As MASMultilineTextBox
            Return ConfigureControl(MASMultilineTextBox.Create(text), configure)
        End Function

        Public Function AddMultilineTextBox(Optional text As String = Nothing,
                                            Optional configure As Action(Of MASMultilineTextBox) = Nothing) As MASMultilineTextBox
            Return AddCreatedControlInternal(CreateMultilineTextBox(text, configure))
        End Function

        Friend Function CreateSearchTextBox(Optional text As String = Nothing,
                                            Optional configure As Action(Of MASSearchTextBox) = Nothing) As MASSearchTextBox
            Return ConfigureControl(MASSearchTextBox.Create(text), configure)
        End Function

        Public Function AddSearchTextBox(Optional text As String = Nothing,
                                         Optional configure As Action(Of MASSearchTextBox) = Nothing) As MASSearchTextBox
            Return AddCreatedControlInternal(CreateSearchTextBox(text, configure))
        End Function

        Friend Function CreatePasswordTextBox(Optional text As String = Nothing,
                                              Optional configure As Action(Of MASPasswordTextBox) = Nothing) As MASPasswordTextBox
            Return ConfigureControl(MASPasswordTextBox.Create(text), configure)
        End Function

        Public Function AddPasswordTextBox(Optional text As String = Nothing,
                                           Optional configure As Action(Of MASPasswordTextBox) = Nothing) As MASPasswordTextBox
            Return AddCreatedControlInternal(CreatePasswordTextBox(text, configure))
        End Function

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

        Public Function AddNumericTextBox(Optional configure As Action(Of MASNumericTextBox) = Nothing) As MASNumericTextBox
            Return AddCreatedControlInternal(CreateNumericTextBox(configure))
        End Function

        Friend Function CreatePathTextBox(Optional path As String = Nothing,
                                          Optional configure As Action(Of MASPathTextBox) = Nothing) As MASPathTextBox
            Return ConfigureControl(MASPathTextBox.Create(path), configure)
        End Function

        Public Function AddPathTextBox(Optional path As String = Nothing,
                                       Optional configure As Action(Of MASPathTextBox) = Nothing) As MASPathTextBox
            Return AddCreatedControlInternal(CreatePathTextBox(path, configure))
        End Function

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

        Public Function AddColorPicker(Optional configure As Action(Of MASColorPicker) = Nothing) As MASColorPicker
            Return AddCreatedControlInternal(CreateColorPicker(configure))
        End Function

        Friend Function CreatePropertyGrid(Optional source As Object = Nothing,
                                           Optional configure As Action(Of MASPropertyGrid) = Nothing) As MASPropertyGrid
            Dim control As MASPropertyGrid = MASPropertyGrid.Create(source)
            Return ConfigureControl(control, configure)
        End Function

        Public Function AddPropertyGrid(Optional source As Object = Nothing,
                                        Optional configure As Action(Of MASPropertyGrid) = Nothing) As MASPropertyGrid
            Return AddCreatedControlInternal(CreatePropertyGrid(source, configure))
        End Function
    End Class

End Namespace
