Option Strict On
Option Explicit On

Namespace Nexamas.UI.FileSystem

    ''' <summary>
    ''' Internal implementation helper behind MASFilePickerOptions factory methods.
    ''' Public SDK code should use MASFilePickerOptions.OpenFile/SaveFile/FolderPicker/etc.
    ''' </summary>
    ''' <remarks>
    ''' This factory is host-neutral.
    ''' It does not know about Overlay, Float, controls, or UI host lifetime.
    ''' </remarks>
    Friend NotInheritable Class FilePickerOptionsFactory

        Private Sub New()
        End Sub

#Region "Open File"

        Friend Shared 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 MASFilePickerOptions

            Return Normalize(New MASFilePickerOptions With {
                .Mode = MASFilePickerMode.OpenFile,
                .Title = title,
                .InitialPath = initialPath,
                .Filter = filter,
                .ShowHidden = showHidden,
                .AllowMultiSelect = allowMultiSelect,
                .FooterText = footerText,
                .PrimaryButtonTextOverride = primaryButtonText,
                .AcceptCurrentPathWhenNoSelection = False
            })

        End Function

#End Region

#Region "Save File"

        Friend Shared 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 MASFilePickerOptions

            Return Normalize(New MASFilePickerOptions With {
                .Mode = MASFilePickerMode.SaveFile,
                .Title = title,
                .InitialPath = initialPath,
                .Filter = filter,
                .FileName = fileName,
                .ConfirmOverwrite = confirmOverwrite,
                .ShowHidden = showHidden,
                .AllowMultiSelect = False,
                .PrimaryButtonTextOverride = primaryButtonText,
                .FooterText = footerText,
                .AcceptCurrentPathWhenNoSelection = False
            })

        End Function

#End Region

#Region "Folder Picker"

        Friend Shared Function FolderPicker(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 MASFilePickerOptions

            Return Normalize(New MASFilePickerOptions With {
                .Mode = MASFilePickerMode.PickTargets,
                .Title = title,
                .InitialPath = initialPath,
                .Filter = "*.*",
                .ShowHidden = showHidden,
                .PrimaryButtonTextOverride = primaryButtonText,
                .FooterText = footerText,
                .TargetKinds = MASFileSystemSelectionKinds.Folder,
                .AllowMultiSelect = False,
                .AcceptCurrentPathWhenNoSelection = acceptCurrentPathWhenNoSelection
            })

        End Function

#End Region

#Region "Multi Folder"

        Friend Shared Function MultiFolderPicker(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 MASFilePickerOptions

            Return Normalize(New MASFilePickerOptions With {
                .Mode = MASFilePickerMode.PickTargets,
                .Title = title,
                .InitialPath = initialPath,
                .Filter = "*.*",
                .ShowHidden = showHidden,
                .PrimaryButtonTextOverride = primaryButtonText,
                .FooterText = footerText,
                .TargetKinds = MASFileSystemSelectionKinds.Folder,
                .AllowMultiSelect = True,
                .AcceptCurrentPathWhenNoSelection = acceptCurrentPathWhenNoSelection
            })

        End Function

#End Region

#Region "Drive Picker"

        Friend Shared Function DrivePicker(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 MASFilePickerOptions

            Return Normalize(New MASFilePickerOptions With {
                .Mode = MASFilePickerMode.PickTargets,
                .Title = title,
                .InitialPath = initialPath,
                .Filter = "*.*",
                .ShowHidden = showHidden,
                .PrimaryButtonTextOverride = primaryButtonText,
                .FooterText = footerText,
                .TargetKinds = MASFileSystemSelectionKinds.Drive,
                .AllowMultiSelect = allowMultiSelect,
                .AcceptCurrentPathWhenNoSelection = False
            })

        End Function

#End Region

#Region "Folder + Drive"

        Friend Shared Function FolderAndDrivePicker(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 MASFilePickerOptions

            Return Normalize(New MASFilePickerOptions With {
                .Mode = MASFilePickerMode.PickTargets,
                .Title = title,
                .InitialPath = initialPath,
                .Filter = "*.*",
                .ShowHidden = showHidden,
                .PrimaryButtonTextOverride = primaryButtonText,
                .FooterText = footerText,
                .TargetKinds = MASFileSystemSelectionKinds.Folder Or MASFileSystemSelectionKinds.Drive,
                .AllowMultiSelect = allowMultiSelect,
                .AcceptCurrentPathWhenNoSelection = acceptCurrentPathWhenNoSelection
            })

        End Function

#End Region

#Region "Generic Targets"

        Friend Shared Function TargetsPicker(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 MASFilePickerOptions

            Dim kinds As MASFileSystemSelectionKinds = targetKinds

            If kinds = MASFileSystemSelectionKinds.None Then
                kinds = MASFileSystemSelectionKinds.Folder Or MASFileSystemSelectionKinds.Drive
            End If

            Return Normalize(New MASFilePickerOptions With {
                .Mode = MASFilePickerMode.PickTargets,
                .Title = title,
                .InitialPath = initialPath,
                .Filter = "*.*",
                .ShowHidden = showHidden,
                .PrimaryButtonTextOverride = primaryButtonText,
                .FooterText = footerText,
                .TargetKinds = kinds,
                .AllowMultiSelect = allowMultiSelect,
                .AcceptCurrentPathWhenNoSelection = acceptCurrentPathWhenNoSelection
            })

        End Function

#End Region

#Region "Normalize Bridge"

        Private Shared Function Normalize(options As MASFilePickerOptions) As MASFilePickerOptions
            Dim result As MASFilePickerOptions = If(options, New MASFilePickerOptions())
            result.Normalize()
            Return result
        End Function

#End Region

    End Class

End Namespace