Option Strict On
Option Explicit On

Imports System
Imports System.Collections.Specialized
Imports System.Diagnostics
Imports System.IO
Imports System.Windows.Forms
Imports Nexamas.UI.Controls
Imports Nexamas.UI.Composition
Imports Nexamas.UI.FileSystem
Imports Nexamas.UI.General
Imports Nexamas.UI.Rendering
Imports Nexamas.UI.Theming
Imports Nexamas.UI.Values
Imports Nexamas.UI.Layout
Imports SkiaSharp

Namespace Nexamas.UI.Components


    Partial Public NotInheritable Class MASFilePickerControl
#Region "SDK Fluent API"

        Public Shared Function Create() As MASFilePickerControl
            Return New MASFilePickerControl()
        End Function

        Friend Shared Function [Default]() As MASFilePickerControl
            Return Create()
        End Function

        Friend Shared Function OpenFile() As MASFilePickerControl
            Return New MASFilePickerControl(
                MASFilePickerOptions.OpenFile(
                    initialPath:=String.Empty,
                    filter:=String.Empty
                )
            )
        End Function

        Friend Shared Function SaveFile() As MASFilePickerControl
            Return New MASFilePickerControl(
                MASFilePickerOptions.SaveFile(
                    initialPath:=String.Empty,
                    filter:=String.Empty,
                    fileName:=String.Empty
                )
            )
        End Function

        Friend Shared Function TargetsPicker() As MASFilePickerControl
            Return New MASFilePickerControl(
                MASFilePickerOptions.TargetsPicker(
                    targetKinds:=MASFileSystemSelectionKinds.Folder Or MASFileSystemSelectionKinds.Drive,
                    initialPath:=String.Empty
                )
            )
        End Function

#Region "Fluent Bounds"

        Friend Function SetBounds(bounds As SKRect) As MASFilePickerControl
            SetLocalLayoutBoundsInternal(bounds)
            Return Me
        End Function

        Friend Function WithBounds(bounds As SKRect) As MASFilePickerControl
            Return SetBounds(bounds)
        End Function

        Friend Function WithBounds(x As Single,
                                   y As Single,
                                   width As Single,
                                   height As Single) As MASFilePickerControl

             SetLocalLayoutBoundsInternal(New SKRect(
                x,
                y,
                x + Math.Max(0.0F, width),
                y + Math.Max(0.0F, height)
            ))

            Return Me
        End Function

        Public Function WithLocation(x As Single,
                                     y As Single) As MASFilePickerControl

            Dim b As SKRect = BoundsLogical

             SetLocalLayoutBoundsInternal(New SKRect(
                x,
                y,
                x + Math.Max(0.0F, b.Width),
                y + Math.Max(0.0F, b.Height)
            ))

            Return Me
        End Function

        Public Shadows Function WithSize(width As Single,
                                 height As Single) As MASFilePickerControl

            Dim b As SKRect = BoundsLogical

             SetLocalLayoutBoundsInternal(New SKRect(
                b.Left,
                b.Top,
                b.Left + Math.Max(0.0F, width),
                b.Top + Math.Max(0.0F, height)
            ))

            Return Me
        End Function

#End Region

#Region "Fluent Options"

        Public Function WithOpenFileMode() As MASFilePickerControl
            Mode = MASFilePickerMode.OpenFile
            Return Me
        End Function

        Public Function WithSaveFileMode() As MASFilePickerControl
            Mode = MASFilePickerMode.SaveFile
            Return Me
        End Function

        Public Function WithTargetsPickerMode() As MASFilePickerControl
            Mode = MASFilePickerMode.PickTargets
            Return Me
        End Function

        Public Function WithTitle(text As String) As MASFilePickerControl
            Title = If(text, String.Empty)
            Return Me
        End Function

        Public Function WithInitialPath(path As String) As MASFilePickerControl
            InitialPath = If(path, String.Empty)
            Return Me
        End Function

        Public Function WithFileName(name As String) As MASFilePickerControl
            FileName = If(name, String.Empty)
            Return Me
        End Function

        Public Function WithFilter(filterText As String) As MASFilePickerControl
            Filter = If(filterText, String.Empty)
            Return Me
        End Function

        Public Function WithFooterText(text As String) As MASFilePickerControl
            FooterText = If(text, String.Empty)
            Return Me
        End Function

        Public Function WithPrimaryButtonText(text As String) As MASFilePickerControl
            PrimaryButtonTextOverride = If(text, String.Empty)
            Return Me
        End Function

        Public Function WithMultiSelect(Optional enabled As Boolean = True) As MASFilePickerControl
            AllowMultiSelect = enabled
            Return Me
        End Function

        Public Function WithSingleSelect() As MASFilePickerControl
            AllowMultiSelect = False
            Return Me
        End Function

        Public Function WithHiddenFiles(Optional visible As Boolean = True) As MASFilePickerControl
            ShowHidden = visible
            Return Me
        End Function

        Public Function WithoutHiddenFiles() As MASFilePickerControl
            ShowHidden = False
            Return Me
        End Function

        Public Function WithOverwriteConfirmation(Optional enabled As Boolean = True) As MASFilePickerControl
            ConfirmOverwrite = enabled
            Return Me
        End Function

#End Region

#Region "Fluent Commands"

        Public Function NavigateToFolder(path As String) As MASFilePickerControl
            NavigateTo(If(path, String.Empty))
            Return Me
        End Function

        Public Function RefreshPicker() As MASFilePickerControl
            RefreshItems()
            Return Me
        End Function

        Public Function LoadRootFolders() As MASFilePickerControl
            LoadRoots()
            Return Me
        End Function

        Public Function SelectFirstItem() As MASFilePickerControl
            SelectFirst()
            Return Me
        End Function

        Public Function UseSelectedNameForSave() As MASFilePickerControl
            UseSelectedFileNameForSave()
            Return Me
        End Function

        Public Function FocusDefault() As MASFilePickerControl
            FocusDefaultInput()
            Return Me
        End Function

#End Region

#Region "Fluent Events"

        Friend Function OnAccepted(handler As EventHandler(Of MASFilePickerResultEventArgs)) As MASFilePickerControl
            If handler Is Nothing Then Return Me

            AddHandler Accepted,
        Sub(sender As Object, e As MASFilePickerResultEventArgs)
            Dim capturedArgs As MASFilePickerResultEventArgs = e

            PostFluentCallback(
                Sub()
                    If _disposedLocal Then Return
                    handler.Invoke(Me, capturedArgs)
                End Sub
            )
        End Sub

            Return Me
        End Function

        Friend Function OnCancelled(handler As EventHandler) As MASFilePickerControl
            If handler Is Nothing Then Return Me

            AddHandler Cancelled,
        Sub(sender As Object, e As EventArgs)
            PostFluentCallback(
                Sub()
                    If _disposedLocal Then Return
                    handler.Invoke(Me, EventArgs.Empty)
                End Sub
            )
        End Sub

            Return Me
        End Function

        Friend Function OnStateChanged(handler As EventHandler) As MASFilePickerControl
            If handler IsNot Nothing Then
                AddHandler StateChanged, handler
            End If

            Return Me
        End Function

        Friend Function OnCurrentPathChanged(handler As EventHandler) As MASFilePickerControl
            If handler IsNot Nothing Then
                AddHandler CurrentPathChanged, handler
            End If

            Return Me
        End Function

        Friend Function OnSelectionChanged(handler As EventHandler) As MASFilePickerControl
            If handler IsNot Nothing Then
                AddHandler SelectionChanged, handler
            End If

            Return Me
        End Function

        Friend Function OnItemsChanged(handler As EventHandler) As MASFilePickerControl
            If handler IsNot Nothing Then
                AddHandler ItemsChanged, handler
            End If

            Return Me
        End Function

#End Region

#Region "Developer Friendly Action Events"

        Friend Function OnAccepted(action As Action(Of MASFilePickerControl,
                                            MASFilePickerResult)) As MASFilePickerControl

            If action Is Nothing Then Return Me

            AddHandler Accepted,
        Sub(sender As Object, e As MASFilePickerResultEventArgs)
            If e Is Nothing Then Return

            Dim capturedResult As MASFilePickerResult = e.Result

            PostFluentCallback(
                Sub()
                    If _disposedLocal Then Return
                    action.Invoke(Me, capturedResult)
                End Sub
            )
        End Sub

            Return Me
        End Function

        Friend Function OnCancelled(action As Action(Of MASFilePickerControl)) As MASFilePickerControl
            If action Is Nothing Then Return Me

            AddHandler Cancelled,
        Sub(sender As Object, e As EventArgs)
            PostFluentCallback(
                Sub()
                    If _disposedLocal Then Return
                    action.Invoke(Me)
                End Sub
            )
        End Sub

            Return Me
        End Function

        Friend Function OnCurrentPathChanged(action As Action(Of MASFilePickerControl,
                                                              String)) As MASFilePickerControl

            If action Is Nothing Then Return Me

            AddHandler CurrentPathChanged,
                Sub(sender As Object, e As EventArgs)
                    action.Invoke(Me, CurrentPath)
                End Sub

            Return Me
        End Function

        ''' <summary>
        ''' Registers a fluent callback that receives the primary selected path only.
        ''' </summary>
        Friend Function OnSelectionChanged(action As Action(Of MASFilePickerControl,
                                                            String)) As MASFilePickerControl

            If action Is Nothing Then Return Me

            AddHandler SelectionChanged,
                Sub(sender As Object, e As EventArgs)
                    action.Invoke(Me, SelectedPath)
                End Sub

            Return Me
        End Function

        ''' <summary>
        ''' Registers a fluent callback that receives a snapshot of all selected paths.
        ''' </summary>
        Friend Function OnSelectedPathsChanged(action As Action(Of MASFilePickerControl,
                                                                IReadOnlyList(Of String))) As MASFilePickerControl

            If action Is Nothing Then Return Me

            AddHandler SelectionChanged,
                Sub(sender As Object, e As EventArgs)
                    action.Invoke(Me, SelectedPaths)
                End Sub

            Return Me
        End Function

#End Region

#End Region


    End Class

End Namespace
