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


    Partial Friend NotInheritable Class MASFileBrowser
#Region "Browser helper utilities"

        Private Sub SafeInvalidate()
            Try
                InvalidateVisual()
            Catch masCaughtException8 As Exception
                Nexamas.UI.Diagnostics.MASExceptionSilencer.SwallowFileSystemBoundary(masCaughtException8)
            End Try
        End Sub


        Private Shared Function NormalizeFilter(value As String) As String
            If String.IsNullOrWhiteSpace(value) Then Return "*.*"

            Dim v As String = value.Trim()

            If String.IsNullOrWhiteSpace(v) Then Return "*.*"

            Return v
        End Function


        Private Shared Function ApplyFilter(items As List(Of FileSystemEntry), filter As String) As List(Of FileSystemEntry)
            If items Is Nothing Then Return New List(Of FileSystemEntry)()

            Dim normalizedFilter As String = NormalizeFilter(filter)

            If String.IsNullOrWhiteSpace(normalizedFilter) OrElse
               String.Equals(normalizedFilter, "*.*", StringComparison.Ordinal) OrElse
               String.Equals(normalizedFilter, "*", StringComparison.Ordinal) Then

                Return items
            End If

            Dim patterns As String() =
                normalizedFilter.Split(New Char() {";"c}, StringSplitOptions.RemoveEmptyEntries)

            If patterns.Length = 0 Then Return items

            Dim result As New List(Of FileSystemEntry)()

            For Each it As FileSystemEntry In items
                If it Is Nothing Then Continue For

                If it.IsFolderLike Then
                    result.Add(it)
                    Continue For
                End If

                Dim matched As Boolean = False

                For Each rawPattern As String In patterns
                    Dim p As String = If(rawPattern, String.Empty).Trim()

                    If String.IsNullOrWhiteSpace(p) Then Continue For

                    If String.Equals(p, "*.*", StringComparison.Ordinal) OrElse
                       String.Equals(p, "*", StringComparison.Ordinal) Then

                        matched = True
                        Exit For
                    End If

                    If p.StartsWith("*.", StringComparison.Ordinal) Then
                        Dim ext As String = p.Substring(1)

                        If String.Equals(it.Extension, ext, StringComparison.OrdinalIgnoreCase) Then
                            matched = True
                            Exit For
                        End If
                    ElseIf String.Equals(it.Name, p, StringComparison.OrdinalIgnoreCase) Then
                        matched = True
                        Exit For
                    End If
                Next

                If matched Then
                    result.Add(it)
                End If
            Next

            Return result
        End Function


        Private Shared Function ResolveTypeText(entry As FileSystemEntry) As String
            If entry Is Nothing Then Return String.Empty

            Select Case entry.EntryType
                Case FileSystemEntryType.Drive
                    Return "Drive"

                Case FileSystemEntryType.Folder
                    Return "Folder"

                Case FileSystemEntryType.Special
                    Return "Special"

                Case FileSystemEntryType.FileItem
                    If Not String.IsNullOrWhiteSpace(entry.Extension) Then
                        Return entry.Extension.TrimStart("."c).ToUpperInvariant() & " File"
                    End If

                    Return "File"

                Case Else
                    Return String.Empty
            End Select
        End Function


        Private Shared Function FormatFileSize(sizeBytes As Long) As String
            If sizeBytes < 0L Then Return String.Empty
            If sizeBytes < 1024L Then Return sizeBytes.ToString() & " B"

            If sizeBytes < 1024L * 1024L Then
                Return (sizeBytes / 1024.0R).ToString("0.#") & " KB"
            End If

            If sizeBytes < 1024L * 1024L * 1024L Then
                Return (sizeBytes / (1024.0R * 1024.0R)).ToString("0.#") & " MB"
            End If

            Return (sizeBytes / (1024.0R * 1024.0R * 1024.0R)).ToString("0.#") & " GB"
        End Function




#End Region

    End Class

End Namespace
