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

    ''' <summary>
    ''' Application service for creating configured MASFilePickerControl instances.
    ''' </summary>
    ''' <remarks>
    ''' Beginner path:
    ''' - Use OpenFile, SaveFile, PickFolder, PickTargets, or the Show* helpers exposed through window.Services.FilePicker.
    '''
    ''' Advanced path:
    ''' - Raw MASFloatRequest creation/showing is an internal implementation detail.
    ''' - Normal application code must not build raw file picker float requests directly.
    '''
    ''' Ownership:
    ''' - Created MASFilePickerControl instances are owned by the caller when using Create/OpenFile/SaveFile/Pick*.
    ''' - Float-backed Show* helpers keep MASFloatRuntime owned by the RootHost.
    ''' </remarks>
    Partial Friend NotInheritable Class MASFilePickerService

        Private ReadOnly _rootHost As MASSkiaRootHost
        Private ReadOnly _ownerGate As New Object()
        Private ReadOnly _activeOwnerKeys As New Dictionary(Of String, Integer)(StringComparer.Ordinal)

        Friend Sub New(rootHost As MASSkiaRootHost)
            If rootHost Is Nothing Then Throw New ArgumentNullException(NameOf(rootHost))
            _rootHost = rootHost
        End Sub

#Region "Generic create"

        Friend Function Create(options As MASFilePickerOptions) As MASFilePickerControl
            Dim safeOptions As MASFilePickerOptions = MASFilePickerOptions.SafeClone(options)

            Dim picker As New MASFilePickerControl(safeOptions)

            ApplyDefaultBounds(picker)
            RequestInvalidate()

            Return picker
        End Function

#End Region

#Region "Open file"

        Friend Function OpenFile(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 = "") As MASFilePickerControl

            Return Create(
                MASFilePickerOptions.OpenFile(
                    title:=title,
                    initialPath:=initialPath,
                    filter:=filter,
                    showHidden:=showHidden,
                    allowMultiSelect:=allowMultiSelect,
                    footerText:=footerText,
                    primaryButtonText:=primaryButtonText
                )
            )
        End Function

#End Region

#Region "Save file"

        Friend Function SaveFile(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 = "") As MASFilePickerControl

            Return Create(
                MASFilePickerOptions.SaveFile(
                    title:=title,
                    initialPath:=initialPath,
                    filter:=filter,
                    fileName:=fileName,
                    confirmOverwrite:=confirmOverwrite,
                    showHidden:=showHidden,
                    primaryButtonText:=primaryButtonText,
                    footerText:=footerText
                )
            )
        End Function

#End Region

#Region "Folder picker"

        Friend Function PickFolder(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 = "") As MASFilePickerControl

            Return Create(
                MASFilePickerOptions.FolderPicker(
                    title:=title,
                    initialPath:=initialPath,
                    showHidden:=showHidden,
                    primaryButtonText:=primaryButtonText,
                    acceptCurrentPathWhenNoSelection:=acceptCurrentPathWhenNoSelection,
                    footerText:=footerText
                )
            )
        End Function

#End Region

#Region "Targets picker"

        Friend Function PickTargets(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 = "") As MASFilePickerControl

            Return Create(
                MASFilePickerOptions.TargetsPicker(
                    targetKinds:=targetKinds,
                    title:=title,
                    initialPath:=initialPath,
                    showHidden:=showHidden,
                    allowMultiSelect:=allowMultiSelect,
                    primaryButtonText:=primaryButtonText,
                    acceptCurrentPathWhenNoSelection:=acceptCurrentPathWhenNoSelection,
                    footerText:=footerText
                )
            )
        End Function

        Friend Function PickDrive(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 = "") As MASFilePickerControl

            Return Create(
                MASFilePickerOptions.DrivePicker(
                    title:=title,
                    initialPath:=initialPath,
                    showHidden:=showHidden,
                    allowMultiSelect:=allowMultiSelect,
                    primaryButtonText:=primaryButtonText,
                    footerText:=footerText
                )
            )
        End Function

        Friend Function PickFolders(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 = "") As MASFilePickerControl

            Return Create(
                MASFilePickerOptions.MultiFolderPicker(
                    title:=title,
                    initialPath:=initialPath,
                    showHidden:=showHidden,
                    primaryButtonText:=primaryButtonText,
                    acceptCurrentPathWhenNoSelection:=acceptCurrentPathWhenNoSelection,
                    footerText:=footerText
                )
            )
        End Function

        Friend Function PickFolderOrDrive(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 = "") As MASFilePickerControl

            Return Create(
                MASFilePickerOptions.FolderAndDrivePicker(
                    title:=title,
                    initialPath:=initialPath,
                    showHidden:=showHidden,
                    allowMultiSelect:=allowMultiSelect,
                    primaryButtonText:=primaryButtonText,
                    acceptCurrentPathWhenNoSelection:=acceptCurrentPathWhenNoSelection,
                    footerText:=footerText
                )
            )
        End Function

#End Region


End Class

End Namespace
