Option Strict On
Option Explicit On

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

Namespace Nexamas.UI.Application

    Partial Friend NotInheritable Class MASFileExplorerService

#Region "Explorer wiring"

        ''' <summary>
        ''' Wires an explorer view to the Float session that hosts it. The wiring is intentionally kept
        ''' inside the service because the service creates the content/session boundary and owns the
        ''' FileExplorer-specific child Float menus.
        ''' </summary>
        Private Sub WireExplorerToFloat(explorer As MASFileExplorerView,
                                        content As MASFloatControlsContent,
                                        ownerKey As String,
                                        getParentHandle As Func(Of MASFloatHandle))

            AddHandler explorer.CloseRequested,
                Sub(sender As Object, e As EventArgs)
                    Dim session As IMASFloatSession = content.Session
                    If session Is Nothing Then Return

                    session.Cancel()
                End Sub

            AddHandler explorer.ViewModeRequested,
                Sub(sender As Object, e As MASFileExplorerViewModeRequestedEventArgs)
                    If e Is Nothing Then Return

                    e.Handled = True

                    Dim parentHandle As MASFloatHandle = Nothing

                    If getParentHandle IsNot Nothing Then
                        parentHandle = getParentHandle.Invoke()
                    End If

                    Dim viewModeOwnerKey As String = ownerKey & ".ViewMode"

                    Dim request As MASFloatRequest =
                        MASFileExplorerViewModeFloatRequestBuilder.CreateRequest(
                            rootHost:=_rootHost,
                            ownerKey:=viewModeOwnerKey,
                            currentMode:=e.CurrentViewMode,
                            anchorRectPx:=e.AnchorRectPx,
                            parentHandle:=parentHandle,
                            onSelected:=
                                Sub(mode As MASListViewMode)
                                    explorer.SetViewMode(mode)
                                End Sub
                        )

                    If request IsNot Nothing Then
                        ShowRequest(request)
                    End If
                End Sub

            AddHandler explorer.ItemContextMenuRequested,
                Sub(sender As Object, e As MASFileExplorerItemContextMenuRequestedEventArgs)
                    If e Is Nothing OrElse e.Item Is Nothing Then Return

                    Dim parentHandle As MASFloatHandle = Nothing

                    If getParentHandle IsNot Nothing Then
                        parentHandle = getParentHandle.Invoke()
                    End If

                    Dim pendingRenameItem As MASFileExplorerItem = Nothing

                    Dim request As MASFloatRequest =
                        MASFileExplorerItemContextMenuFloatRequestBuilder.CreateRequest(
                            rootHost:=_rootHost,
                            ownerKey:=ownerKey & ".ItemContextMenu",
                            item:=e.Item,
                            anchorRectPx:=e.AnchorRectPx,
                            parentHandle:=parentHandle,
                            onCommand:=Sub(commandId As String, item As MASFileExplorerItem)
                                           Dim id As String = If(commandId, String.Empty).Trim()

                                           If String.Equals(id, MASFileExplorerContextMenuCommands.Rename, StringComparison.Ordinal) Then
                                               pendingRenameItem = item
                                               Return
                                           End If

                                           explorer.ExecuteItemContextMenuCommand(id, item)
                                       End Sub,
                            onClosed:=Sub(args As MASFloatClosedEventArgs)
                                          Dim itemToRename As MASFileExplorerItem = pendingRenameItem
                                          pendingRenameItem = Nothing

                                          If itemToRename IsNot Nothing Then
                                              explorer.BeginInlineRenameItem(itemToRename)
                                          End If
                                      End Sub
                        )

                    If request IsNot Nothing Then
                        ShowRequest(request)
                    End If
                End Sub

            AddHandler explorer.EmptySpaceContextMenuRequested,
                Sub(sender As Object, e As MASFileExplorerEmptySpaceContextMenuRequestedEventArgs)
                    If e Is Nothing Then Return

                    Dim parentHandle As MASFloatHandle = Nothing

                    If getParentHandle IsNot Nothing Then
                        parentHandle = getParentHandle.Invoke()
                    End If

                    Dim request As MASFloatRequest =
                        MASFileExplorerItemContextMenuFloatRequestBuilder.CreateBackgroundRequest(
                            rootHost:=_rootHost,
                            ownerKey:=ownerKey & ".FolderContextMenu",
                            currentFolder:=explorer.CurrentFolder,
                            anchorRectPx:=e.AnchorRectPx,
                            parentHandle:=parentHandle,
                            onCommand:=Sub(commandId As String)
                                           explorer.ExecuteBackgroundContextMenuCommand(commandId)
                                       End Sub
                        )

                    If request IsNot Nothing Then
                        ShowRequest(request)
                    End If
                End Sub

            AddHandler explorer.InlineRenameFailed,
                Sub(sender As Object, e As MASFileExplorerInlineRenameFailedEventArgs)
                    If e Is Nothing Then Return

                    Dim parentHandle As MASFloatHandle = Nothing

                    If getParentHandle IsNot Nothing Then
                        parentHandle = getParentHandle.Invoke()
                    End If

                    ShowInlineRenameWarning(
                        ownerKey:=ownerKey & ".Rename.Warning",
                        message:=If(String.IsNullOrWhiteSpace(e.Message), "Rename failed.", e.Message),
                        parentHandle:=parentHandle)
                End Sub

        End Sub

        ''' <summary>
        ''' Shows a parent-scoped warning when an inline rename operation fails inside the file explorer.
        ''' </summary>
        Private Sub ShowInlineRenameWarning(ownerKey As String,
                                            message As String,
                                            parentHandle As MASFloatHandle)
            Dim safeMessage As String = If(String.IsNullOrWhiteSpace(message), "Rename failed.", message)

            If parentHandle Is Nothing Then
                _rootHost.ShowWarningMessageBox(
                    ownerKey:=ownerKey,
                    message:=safeMessage,
                    title:="Rename")
                Return
            End If

            Dim request As MASFloatRequest =
                _rootHost.CreateMessageBoxFloatRequest(
                    ownerKey:=ownerKey,
                    messageBox:=MessageBoxRequestFactory.Warning(
                        message:=safeMessage,
                        title:="Rename"),
                    showPolicy:=MASFloatShowPolicy.CloseSameOwnerThenShow)

            If request Is Nothing Then Return

            request.ParentHandle = parentHandle
            request.RequestedScope = MASFloatScope.ParentFloat
            request.RequestedSlot = MASFloatSlot.Popup
            request.RequestedLayer = MASFloatLayerLevel.SystemCritical
            request.Shield = MASFloatShieldOptions.None

            ShowRequest(request)
        End Sub

#End Region

    End Class

End Namespace
