Option Strict On
Option Explicit On

Imports System
Imports System.Collections.Generic
Imports Nexamas.UI.Components
Imports Nexamas.UI.FileSystem
Imports Nexamas.UI.FloatRuntime
Imports Nexamas.UI.Host
Imports SkiaSharp

Namespace Nexamas.UI.Application

    Partial Friend NotInheritable Class MASFilePickerService

#Region "Float show helpers"

        Friend Function ShowOpenFile(ownerKey As String,
                                     Optional title As String = "Open File",
                                     Optional initialPath As String = "",
                                     Optional filter As String = "*.*",
                                     Optional showHidden As Boolean = False,
                                     Optional allowMultiSelect As Boolean = False,
                                     Optional footerText As String = "",
                                     Optional primaryButtonText As String = "",
                                     Optional onOpened As Action(Of MASFloatHandle) = Nothing,
                                     Optional onClosed As Action(Of MASFloatClosedEventArgs) = Nothing,
                                     Optional onAccepted As Action(Of MASFilePickerResult) = Nothing,
                                     Optional onCancelled As Action = Nothing) As MASFloatHandle

            Return ToCompatibilityFloatHandle(
                ShowOpenFileEx(ownerKey, title, initialPath, filter, showHidden, allowMultiSelect, footerText, primaryButtonText, onOpened, onClosed, onAccepted, onCancelled))
        End Function

        Friend Function ShowOpenFileEx(ownerKey As String,
                                       Optional title As String = "Open File",
                                       Optional initialPath As String = "",
                                       Optional filter As String = "*.*",
                                       Optional showHidden As Boolean = False,
                                       Optional allowMultiSelect As Boolean = False,
                                       Optional footerText As String = "",
                                       Optional primaryButtonText As String = "",
                                       Optional onOpened As Action(Of MASFloatHandle) = Nothing,
                                       Optional onClosed As Action(Of MASFloatClosedEventArgs) = Nothing,
                                       Optional onAccepted As Action(Of MASFilePickerResult) = Nothing,
                                       Optional onCancelled As Action = Nothing) As MASFloatShowResult

            Dim request As MASFloatRequest =
                MASFilePickerFloatRequestBuilder.OpenFile(
                    rootHost:=_rootHost,
                    ownerKey:=NormalizeOwnerKey(ownerKey),
                    title:=title,
                    initialPath:=initialPath,
                    filter:=filter,
                    showHidden:=showHidden,
                    allowMultiSelect:=allowMultiSelect,
                    footerText:=footerText,
                    primaryButtonText:=primaryButtonText,
                    onOpened:=onOpened,
                    onClosed:=ComposeFilePickerClosedCallback(onClosed, onAccepted, onCancelled)
                )

            Return ShowRequestEx(request)
        End Function

        Friend Function ShowSaveFile(ownerKey As String,
                                     Optional title As String = "Save File",
                                     Optional initialPath As String = "",
                                     Optional filter As String = "*.*",
                                     Optional fileName As String = "",
                                     Optional confirmOverwrite As Boolean = True,
                                     Optional showHidden As Boolean = False,
                                     Optional primaryButtonText As String = "",
                                     Optional footerText As String = "",
                                     Optional onOpened As Action(Of MASFloatHandle) = Nothing,
                                     Optional onClosed As Action(Of MASFloatClosedEventArgs) = Nothing,
                                     Optional onAccepted As Action(Of MASFilePickerResult) = Nothing,
                                     Optional onCancelled As Action = Nothing) As MASFloatHandle

            Return ToCompatibilityFloatHandle(
                ShowSaveFileEx(ownerKey, title, initialPath, filter, fileName, confirmOverwrite, showHidden, primaryButtonText, footerText, onOpened, onClosed, onAccepted, onCancelled))
        End Function

        Friend Function ShowSaveFileEx(ownerKey As String,
                                       Optional title As String = "Save File",
                                       Optional initialPath As String = "",
                                       Optional filter As String = "*.*",
                                       Optional fileName As String = "",
                                       Optional confirmOverwrite As Boolean = True,
                                       Optional showHidden As Boolean = False,
                                       Optional primaryButtonText As String = "",
                                       Optional footerText As String = "",
                                       Optional onOpened As Action(Of MASFloatHandle) = Nothing,
                                       Optional onClosed As Action(Of MASFloatClosedEventArgs) = Nothing,
                                       Optional onAccepted As Action(Of MASFilePickerResult) = Nothing,
                                       Optional onCancelled As Action = Nothing) As MASFloatShowResult

            Dim request As MASFloatRequest =
                MASFilePickerFloatRequestBuilder.SaveFile(
                    rootHost:=_rootHost,
                    ownerKey:=NormalizeOwnerKey(ownerKey),
                    title:=title,
                    initialPath:=initialPath,
                    filter:=filter,
                    fileName:=fileName,
                    confirmOverwrite:=confirmOverwrite,
                    showHidden:=showHidden,
                    primaryButtonText:=primaryButtonText,
                    footerText:=footerText,
                    onOpened:=onOpened,
                    onClosed:=ComposeFilePickerClosedCallback(onClosed, onAccepted, onCancelled)
                )

            Return ShowRequestEx(request)
        End Function

        Friend Function ShowPickFolder(ownerKey As String,
                                       Optional title As String = "Select Folder",
                                       Optional initialPath As String = "",
                                       Optional showHidden As Boolean = False,
                                       Optional primaryButtonText As String = "",
                                       Optional acceptCurrentPathWhenNoSelection As Boolean = False,
                                       Optional footerText As String = "",
                                       Optional onOpened As Action(Of MASFloatHandle) = Nothing,
                                       Optional onClosed As Action(Of MASFloatClosedEventArgs) = Nothing,
                                       Optional onAccepted As Action(Of MASFilePickerResult) = Nothing,
                                       Optional onCancelled As Action = Nothing) As MASFloatHandle

            Return ToCompatibilityFloatHandle(
                ShowPickFolderEx(ownerKey, title, initialPath, showHidden, primaryButtonText, acceptCurrentPathWhenNoSelection, footerText, onOpened, onClosed, onAccepted, onCancelled))
        End Function

        Friend Function ShowPickFolderEx(ownerKey As String,
                                         Optional title As String = "Select Folder",
                                         Optional initialPath As String = "",
                                         Optional showHidden As Boolean = False,
                                         Optional primaryButtonText As String = "",
                                         Optional acceptCurrentPathWhenNoSelection As Boolean = False,
                                         Optional footerText As String = "",
                                         Optional onOpened As Action(Of MASFloatHandle) = Nothing,
                                         Optional onClosed As Action(Of MASFloatClosedEventArgs) = Nothing,
                                         Optional onAccepted As Action(Of MASFilePickerResult) = Nothing,
                                         Optional onCancelled As Action = Nothing) As MASFloatShowResult

            Dim request As MASFloatRequest =
                MASFilePickerFloatRequestBuilder.PickFolder(
                    rootHost:=_rootHost,
                    ownerKey:=NormalizeOwnerKey(ownerKey),
                    title:=title,
                    initialPath:=initialPath,
                    showHidden:=showHidden,
                    primaryButtonText:=primaryButtonText,
                    acceptCurrentPathWhenNoSelection:=acceptCurrentPathWhenNoSelection,
                    footerText:=footerText,
                    onOpened:=onOpened,
                    onClosed:=ComposeFilePickerClosedCallback(onClosed, onAccepted, onCancelled)
                )

            Return ShowRequestEx(request)
        End Function

        Friend Function ShowPickTargets(ownerKey As String,
                                        targetKinds As MASFileSystemSelectionKinds,
                                        Optional title As String = "Select Targets",
                                        Optional initialPath As String = "",
                                        Optional showHidden As Boolean = False,
                                        Optional allowMultiSelect As Boolean = False,
                                        Optional primaryButtonText As String = "",
                                        Optional acceptCurrentPathWhenNoSelection As Boolean = False,
                                        Optional footerText As String = "",
                                        Optional onOpened As Action(Of MASFloatHandle) = Nothing,
                                        Optional onClosed As Action(Of MASFloatClosedEventArgs) = Nothing,
                                        Optional onAccepted As Action(Of MASFilePickerResult) = Nothing,
                                        Optional onCancelled As Action = Nothing) As MASFloatHandle

            Return ToCompatibilityFloatHandle(
                ShowPickTargetsEx(ownerKey, targetKinds, title, initialPath, showHidden, allowMultiSelect, primaryButtonText, acceptCurrentPathWhenNoSelection, footerText, onOpened, onClosed, onAccepted, onCancelled))
        End Function

        Friend Function ShowPickTargetsEx(ownerKey As String,
                                          targetKinds As MASFileSystemSelectionKinds,
                                          Optional title As String = "Select Targets",
                                          Optional initialPath As String = "",
                                          Optional showHidden As Boolean = False,
                                          Optional allowMultiSelect As Boolean = False,
                                          Optional primaryButtonText As String = "",
                                          Optional acceptCurrentPathWhenNoSelection As Boolean = False,
                                          Optional footerText As String = "",
                                          Optional onOpened As Action(Of MASFloatHandle) = Nothing,
                                          Optional onClosed As Action(Of MASFloatClosedEventArgs) = Nothing,
                                          Optional onAccepted As Action(Of MASFilePickerResult) = Nothing,
                                          Optional onCancelled As Action = Nothing) As MASFloatShowResult

            Dim request As MASFloatRequest =
                MASFilePickerFloatRequestBuilder.PickTargets(
                    rootHost:=_rootHost,
                    ownerKey:=NormalizeOwnerKey(ownerKey),
                    targetKinds:=targetKinds,
                    title:=title,
                    initialPath:=initialPath,
                    showHidden:=showHidden,
                    allowMultiSelect:=allowMultiSelect,
                    primaryButtonText:=primaryButtonText,
                    acceptCurrentPathWhenNoSelection:=acceptCurrentPathWhenNoSelection,
                    footerText:=footerText,
                    onOpened:=onOpened,
                    onClosed:=ComposeFilePickerClosedCallback(onClosed, onAccepted, onCancelled)
                )

            Return ShowRequestEx(request)
        End Function

        Friend Function ShowPickDrive(ownerKey As String,
                                      Optional title As String = "Select Drive",
                                      Optional initialPath As String = "",
                                      Optional showHidden As Boolean = False,
                                      Optional allowMultiSelect As Boolean = False,
                                      Optional primaryButtonText As String = "",
                                      Optional footerText As String = "",
                                      Optional onOpened As Action(Of MASFloatHandle) = Nothing,
                                      Optional onClosed As Action(Of MASFloatClosedEventArgs) = Nothing,
                                      Optional onAccepted As Action(Of MASFilePickerResult) = Nothing,
                                      Optional onCancelled As Action = Nothing) As MASFloatHandle

            Return ToCompatibilityFloatHandle(
                ShowPickDriveEx(ownerKey, title, initialPath, showHidden, allowMultiSelect, primaryButtonText, footerText, onOpened, onClosed, onAccepted, onCancelled))
        End Function

        Friend Function ShowPickDriveEx(ownerKey As String,
                                        Optional title As String = "Select Drive",
                                        Optional initialPath As String = "",
                                        Optional showHidden As Boolean = False,
                                        Optional allowMultiSelect As Boolean = False,
                                        Optional primaryButtonText As String = "",
                                        Optional footerText As String = "",
                                        Optional onOpened As Action(Of MASFloatHandle) = Nothing,
                                        Optional onClosed As Action(Of MASFloatClosedEventArgs) = Nothing,
                                        Optional onAccepted As Action(Of MASFilePickerResult) = Nothing,
                                        Optional onCancelled As Action = Nothing) As MASFloatShowResult

            Dim request As MASFloatRequest =
                MASFilePickerFloatRequestBuilder.PickDrive(
                    rootHost:=_rootHost,
                    ownerKey:=NormalizeOwnerKey(ownerKey),
                    title:=title,
                    initialPath:=initialPath,
                    showHidden:=showHidden,
                    allowMultiSelect:=allowMultiSelect,
                    primaryButtonText:=primaryButtonText,
                    footerText:=footerText,
                    onOpened:=onOpened,
                    onClosed:=ComposeFilePickerClosedCallback(onClosed, onAccepted, onCancelled)
                )

            Return ShowRequestEx(request)
        End Function

        Friend Function ShowPickFolders(ownerKey As String,
                                        Optional title As String = "Select Folders",
                                        Optional initialPath As String = "",
                                        Optional showHidden As Boolean = False,
                                        Optional primaryButtonText As String = "",
                                        Optional acceptCurrentPathWhenNoSelection As Boolean = False,
                                        Optional footerText As String = "",
                                        Optional onOpened As Action(Of MASFloatHandle) = Nothing,
                                        Optional onClosed As Action(Of MASFloatClosedEventArgs) = Nothing,
                                        Optional onAccepted As Action(Of MASFilePickerResult) = Nothing,
                                        Optional onCancelled As Action = Nothing) As MASFloatHandle

            Return ToCompatibilityFloatHandle(
                ShowPickFoldersEx(ownerKey, title, initialPath, showHidden, primaryButtonText, acceptCurrentPathWhenNoSelection, footerText, onOpened, onClosed, onAccepted, onCancelled))
        End Function

        Friend Function ShowPickFoldersEx(ownerKey As String,
                                          Optional title As String = "Select Folders",
                                          Optional initialPath As String = "",
                                          Optional showHidden As Boolean = False,
                                          Optional primaryButtonText As String = "",
                                          Optional acceptCurrentPathWhenNoSelection As Boolean = False,
                                          Optional footerText As String = "",
                                          Optional onOpened As Action(Of MASFloatHandle) = Nothing,
                                          Optional onClosed As Action(Of MASFloatClosedEventArgs) = Nothing,
                                          Optional onAccepted As Action(Of MASFilePickerResult) = Nothing,
                                          Optional onCancelled As Action = Nothing) As MASFloatShowResult

            Dim request As MASFloatRequest =
                MASFilePickerFloatRequestBuilder.PickFolders(
                    rootHost:=_rootHost,
                    ownerKey:=NormalizeOwnerKey(ownerKey),
                    title:=title,
                    initialPath:=initialPath,
                    showHidden:=showHidden,
                    primaryButtonText:=primaryButtonText,
                    acceptCurrentPathWhenNoSelection:=acceptCurrentPathWhenNoSelection,
                    footerText:=footerText,
                    onOpened:=onOpened,
                    onClosed:=ComposeFilePickerClosedCallback(onClosed, onAccepted, onCancelled)
                )

            Return ShowRequestEx(request)
        End Function

        Friend Function ShowPickFolderOrDrive(ownerKey As String,
                                              Optional title As String = "Select Targets",
                                              Optional initialPath As String = "",
                                              Optional showHidden As Boolean = False,
                                              Optional allowMultiSelect As Boolean = True,
                                              Optional primaryButtonText As String = "",
                                              Optional acceptCurrentPathWhenNoSelection As Boolean = False,
                                              Optional footerText As String = "",
                                              Optional onOpened As Action(Of MASFloatHandle) = Nothing,
                                              Optional onClosed As Action(Of MASFloatClosedEventArgs) = Nothing,
                                              Optional onAccepted As Action(Of MASFilePickerResult) = Nothing,
                                              Optional onCancelled As Action = Nothing) As MASFloatHandle

            Return ToCompatibilityFloatHandle(
                ShowPickFolderOrDriveEx(ownerKey, title, initialPath, showHidden, allowMultiSelect, primaryButtonText, acceptCurrentPathWhenNoSelection, footerText, onOpened, onClosed, onAccepted, onCancelled))
        End Function

        Friend Function ShowPickFolderOrDriveEx(ownerKey As String,
                                                Optional title As String = "Select Targets",
                                                Optional initialPath As String = "",
                                                Optional showHidden As Boolean = False,
                                                Optional allowMultiSelect As Boolean = True,
                                                Optional primaryButtonText As String = "",
                                                Optional acceptCurrentPathWhenNoSelection As Boolean = False,
                                                Optional footerText As String = "",
                                                Optional onOpened As Action(Of MASFloatHandle) = Nothing,
                                                Optional onClosed As Action(Of MASFloatClosedEventArgs) = Nothing,
                                                Optional onAccepted As Action(Of MASFilePickerResult) = Nothing,
                                                Optional onCancelled As Action = Nothing) As MASFloatShowResult

            Dim request As MASFloatRequest =
                MASFilePickerFloatRequestBuilder.PickFolderOrDrive(
                    rootHost:=_rootHost,
                    ownerKey:=NormalizeOwnerKey(ownerKey),
                    title:=title,
                    initialPath:=initialPath,
                    showHidden:=showHidden,
                    allowMultiSelect:=allowMultiSelect,
                    primaryButtonText:=primaryButtonText,
                    acceptCurrentPathWhenNoSelection:=acceptCurrentPathWhenNoSelection,
                    footerText:=footerText,
                    onOpened:=onOpened,
                    onClosed:=ComposeFilePickerClosedCallback(onClosed, onAccepted, onCancelled)
                )

            Return ShowRequestEx(request)
        End Function

#End Region

    End Class

End Namespace
