using System.IO;
using System.Linq;
using API.Comparators;
namespace API.Extensions
{
    public static class DirectoryInfoExtensions
    {
        private static readonly NaturalSortComparer Comparer = new NaturalSortComparer();
        public static void Empty(this DirectoryInfo directory)
        {
            foreach(FileInfo file in directory.EnumerateFiles()) file.Delete();
            foreach(DirectoryInfo subDirectory in directory.EnumerateDirectories()) subDirectory.Delete(true);
        }
        /// 
        /// Flattens all files in subfolders to the passed directory recursively.
        /// 
        /// 
        /// foo
        /// ├── 1.txt
        /// ├── 2.txt
        /// ├── 3.txt
        /// ├── 4.txt
        /// └── bar
        ///     ├── 1.txt
        ///     ├── 2.txt
        ///     └── 5.txt
        /// 
        /// becomes:
        /// foo
        /// ├── 1.txt
        /// ├── 2.txt
        /// ├── 3.txt
        /// ├── 4.txt
        ///     ├── bar_1.txt
        ///     ├── bar_2.txt
        ///     └── bar_5.txt
        /// 
        /// 
        public static void Flatten(this DirectoryInfo directory)
        {
            var index = 0;
            FlattenDirectory(directory, directory, ref index);
        }
        private static void FlattenDirectory(DirectoryInfo root, DirectoryInfo directory, ref int directoryIndex)
        {
            if (!root.FullName.Equals(directory.FullName))
            {
                var fileIndex = 1;
                
                foreach (var file in directory.EnumerateFiles().OrderBy(file => file.FullName, Comparer))
                {
                    if (file.Directory == null) continue;
                    var paddedIndex = Parser.Parser.PadZeros(directoryIndex + "");
                    // We need to rename the files so that after flattening, they are in the order we found them
                    var newName = $"{paddedIndex}_{Parser.Parser.PadZeros(fileIndex + "")}{file.Extension}";
                    var newPath = Path.Join(root.FullName, newName);
                    if (!File.Exists(newPath)) file.MoveTo(newPath);
                    fileIndex++;
                }
                directoryIndex++;
            }
            
            foreach (var subDirectory in directory.EnumerateDirectories())
            {
                FlattenDirectory(root, subDirectory, ref directoryIndex);
            }
        }
    }
}