Option Strict On
Option Explicit On

Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Threading
Imports System.Threading.Tasks

Imports Nexamas.UI.Architecture
Imports Nexamas.UI.Composition
Imports Nexamas.UI.Controls
Imports Nexamas.UI.FileSystem
Imports Nexamas.UI.General
Imports Nexamas.UI.Icons
Imports Nexamas.UI.Layout
Imports Nexamas.UI.Platform
Imports Nexamas.UI.Theming
Imports Nexamas.UI.Values

Imports SkiaSharp

Namespace Nexamas.UI.Components

    ''' <summary>
    ''' Pure Skia file-system browser control.
    ''' </summary>
    ''' <remarks>
    ''' MASFileBrowser is intentionally independent from FilePicker, Overlay, and Float.
    ''' It only displays file-system entries, manages selection, and raises browser-level events.
    '''
    ''' Ownership rules:
    ''' - It does not open or close any host.
    ''' - It does not know about modal state, shield state, overlay state, or float state.
    ''' - It does not produce MASFilePickerResult.
    ''' - The owner decides what to do with ItemActivated and SelectionChanged.
    ''' </remarks>
    Partial Friend NotInheritable Class MASFileBrowser
        Inherits MASControlBase
        Implements IMASIntrinsicSizeContract
        Implements IMASScrollContentSizeContract
        Implements IMASLayoutParticipant
        Implements IMASControlRuntimeServicesConsumer

        Private Shared ReadOnly _contract As MASResolvedComponentContract =
            MASArchitectureRuntime.ResolveContractOrThrow(GetType(MASFileBrowser))

        Private ReadOnly _list As MASListView

        Private _provider As IFileSystemProvider
        Private _childrenLoader As FileSystemEntryChildrenLoader
        Private _computerRootBuilder As FileSystemComputerRootBuilder

        Private ReadOnly _items As New List(Of FileSystemEntry)()
        Private _currentPath As String = String.Empty

        Private ReadOnly _selectedPaths As New HashSet(Of String)(StringComparer.OrdinalIgnoreCase)
        Private _selectedPathsSnapshotDirty As Boolean = True
        Private _selectedPathsSnapshot As IReadOnlyList(Of String) = New List(Of String)().AsReadOnly()
        Private _selectionSignatureDirty As Boolean = True
        Private _selectionSignatureSnapshot As String = String.Empty
        Private _selectedIndex As Integer = -1

        Private _showHidden As Boolean = False
        Private _filter As String = "*.*"

        Private _selectionPolicy As MASFileBrowserSelectionPolicy =
            MASFileBrowserSelectionPolicy.FilesOnly(False)

        Private _syncingListSelection As Boolean = False
        Private ReadOnly _loadGate As New Object()
        Private _runtimeServices As MASControlRuntimeServices
        Private _loadCancellation As CancellationTokenSource = Nothing
        Private _loadGeneration As Integer = 0
        Private _isLoadingItems As Boolean = False
        Private _disposedLocal As Boolean = False

        Friend Event CurrentPathChanged As EventHandler
        Friend Event ItemsChanged As EventHandler
        Friend Event SelectionChanged As EventHandler
        Friend Event ItemActivated As EventHandler(Of FileSystemEntryEventArgs)
        Friend Event ItemContextMenuRequested As EventHandler(Of MASFilePickerItemContextMenuRequestedEventArgs)
        Friend Event EmptySpaceContextMenuRequested As EventHandler(Of MASFilePickerEmptySpaceContextMenuRequestedEventArgs)
        Friend Event InlineRenameCommitted As EventHandler(Of MASFilePickerInlineRenameCommittedEventArgs)

        Friend Sub New()
            _provider = New LocalFileSystemProvider()
            _childrenLoader = New FileSystemEntryChildrenLoader(_provider)
            _computerRootBuilder = New FileSystemComputerRootBuilder(_provider)

            _list = New MASListView() With {
                .Name = "FileBrowserList",
                .ViewMode = MASListViewMode.Details,
                .ChromeMode = MASListViewChromeMode.Embedded
            }

            ConfigureList()
            RegisterChild(_list)
        End Sub




    End Class

End Namespace
