Option Strict On
Option Explicit On

Imports System
Imports System.Collections.Generic
Imports System.Collections.ObjectModel
Imports System.Windows.Forms
Imports Nexamas.UI.Architecture
Imports Nexamas.UI.Composition
Imports Nexamas.UI.Controls
Imports Nexamas.UI.General
Imports Nexamas.UI.Icons
Imports Nexamas.UI.Layout
Imports Nexamas.UI.Rendering
Imports Nexamas.UI.TextRendering
Imports Nexamas.UI.Theming
Imports Nexamas.UI.Values
Imports SkiaSharp

Namespace Nexamas.UI.Components

    Partial Public NotInheritable Class MASFileDropZone

#Region "File State"
        Private Function FindAcceptedPathIndex(path As String) As Integer
            Dim normalized As String = MASFileDropZonePolicy.NormalizeFilePath(path)
            If normalized.Length = 0 Then Return -1
            For i As Integer = 0 To _acceptedPaths.Count - 1
                If String.Equals(_acceptedPaths(i), normalized, StringComparison.OrdinalIgnoreCase) Then Return i
            Next
            Return -1
        End Function

        Private Function TryAcceptFile(path As String) As Boolean
            Dim normalized As String = MASFileDropZonePolicy.NormalizeFilePath(path)
            If normalized.Length = 0 Then
                RememberRejected(path, "Empty path")
                Return False
            End If

            If Not _multipleSelection AndAlso _acceptedPaths.Count >= 1 Then
                RememberRejected(normalized, "Only one file is allowed")
                Return False
            End If

            If _acceptedPaths.Count >= FileDropZoneTokens.MaxStoredFiles Then
                RememberRejected(normalized, "File limit reached")
                Return False
            End If

            For Each existing As String In _acceptedPaths
                If String.Equals(existing, normalized, StringComparison.OrdinalIgnoreCase) Then
                    RememberRejected(normalized, "Already added")
                    Return False
                End If
            Next

            If Not MASFileDropZonePolicy.IsExtensionAllowed(normalized, _allowedExtensions) Then
                RememberRejected(normalized, "File type not allowed")
                Return False
            End If

            _acceptedPaths.Add(normalized)
            _rows.Add(New FileDropRow(normalized, True, String.Empty))
            _lastRejectedReason = String.Empty
            TrimRows()
            Return True
        End Function

        Private Sub RememberRejected(path As String,
                                     reason As String)
            Dim normalized As String = MASFileDropZonePolicy.NormalizeFilePath(path)
            If normalized.Length = 0 Then normalized = "Rejected file"
            _lastRejectedReason = If(reason, String.Empty)
            _rows.Add(New FileDropRow(normalized, False, _lastRejectedReason))
            TrimRows()
        End Sub

        Private Sub TrimRows()
            Dim maxRows As Integer = FileDropZoneTokens.MaxStoredFiles + FileDropZoneTokens.MaxPreviewRows
            While _rows.Count > maxRows
                _rows.RemoveAt(0)
            End While
        End Sub
#End Region

    End Class

End Namespace
