using Microsoft.Extensions.Logging;
using System.Globalization;

namespace File_Folder_Helper.ADO2024.PI1;

internal static partial class Helper20240305
{

    private static void TryArchiveFiles(string sourceDirectory, string pattern, string archiveDirectory, string days)
    {
        string checkFile;
        FileInfo fileInfo;
        string weekOfYear;
        string checkDirectory;
        string[] directorySegments;
        Calendar calendar = new CultureInfo("en-US").Calendar;
        DateTime dateTime = DateTime.Now.AddDays(-int.Parse(days));
        string[] sourceDirectorySegments = sourceDirectory.Split('/');
        // DirectoryInfo directoryInfo = new(Path.GetFullPath(sourceDirectory));
        // IEnumerable<FileInfo> fileInfoCollection = directoryInfo.EnumerateFiles(pattern, new EnumerationOptions { IgnoreInaccessible = true, RecurseSubdirectories = true });
        string[] files = Directory.GetFiles(sourceDirectory, pattern, SearchOption.AllDirectories);
        if (!sourceDirectory.StartsWith('\\') && sourceDirectorySegments.Length < 2)
            throw new Exception("Can't be root drive!");
        // foreach (FileInfo fileInfo in fileInfoCollection)
        foreach (string file in files)
        {
            fileInfo = new FileInfo(file);
            if (string.IsNullOrEmpty(fileInfo.DirectoryName) || fileInfo.LastWriteTime > dateTime)
                continue;
            directorySegments = fileInfo.DirectoryName.Split(Path.DirectorySeparatorChar);
            if (directorySegments.Length < sourceDirectorySegments.Length)
                continue;
            weekOfYear = $"{fileInfo.CreationTime.Year}_Week_{calendar.GetWeekOfYear(fileInfo.CreationTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday):00}";
            // checkDirectory = string.Concat(archiveDirectory, Path.DirectorySeparatorChar, weekOfYear, Path.DirectorySeparatorChar, string.Join(Path.DirectorySeparatorChar, directorySegments.Skip(sourceDirectorySegments.Length)));
            checkDirectory = string.Concat(archiveDirectory, Path.DirectorySeparatorChar, weekOfYear);
            for (int i = sourceDirectorySegments.Length; i < directorySegments.Length; i++)
                checkDirectory = string.Concat(checkDirectory, Path.DirectorySeparatorChar, directorySegments[i]);
            if (!Directory.Exists(checkDirectory))
                _ = Directory.CreateDirectory(checkDirectory);
            checkFile = Path.Combine(checkDirectory, fileInfo.Name);
            if (File.Exists(checkFile))
                continue;
            // File.WriteAllText(checkFile, string.Empty);
            File.Move(fileInfo.FullName, checkFile);
        }
    }

    internal static void ArchiveFiles(ILogger<Worker> logger, List<string> args)
    {
        string days = args[4];
        string pattern = args[2];
        string sourceDirectory = args[0];
        string archiveDirectory = Path.GetFullPath(args[3]);
        logger.LogInformation(sourceDirectory);
        TryArchiveFiles(sourceDirectory, pattern, archiveDirectory, days);
    }

}