using Microsoft.Extensions.Logging;
using System.Collections.ObjectModel;
using System.Globalization;
namespace File_Folder_Helper.ADO2024.PI3;

internal static partial class Helper20240910
{

    internal static void MoveFilesToWeekOfYear(ILogger<Worker> logger, List<string> args)
    {
        string day;
        string year;
        string yearB;
        string yearC;
        string checkFile;
        FileInfo fileInfo;
        string weekOfYear;
        int weekOfYearValue;
        string checkDirectory;
        string searchPattern = args[2];
        ReadOnlyCollection<string> directoryNames;
        string sourceDirectory = Path.GetFullPath(args[0]);
        Calendar calendar = new CultureInfo("en-US").Calendar;
        string[] files = Directory.GetFiles(sourceDirectory, searchPattern, SearchOption.AllDirectories);
        logger.LogInformation("With search pattern '{SearchPattern}' found {files}", searchPattern, files.Length);
        foreach (string file in files)
        {
            fileInfo = new(file);
            if (string.IsNullOrEmpty(fileInfo.DirectoryName))
                continue;
            checkDirectory = string.Empty;
            year = $"{fileInfo.LastWriteTime:yyyy}";
            yearB = $"{fileInfo.LastWriteTime:yyyy}_Year";
            day = fileInfo.LastWriteTime.ToString("yyyy-MM-dd");
            directoryNames = Helpers.HelperDirectory.GetDirectoryNames(fileInfo.DirectoryName);
            weekOfYearValue = calendar.GetWeekOfYear(fileInfo.LastWriteTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday);
            yearC = weekOfYearValue < 27 ? $"{fileInfo.LastWriteTime:yyyy}_Year_A" : $"{fileInfo.LastWriteTime:yyyy}_Year_Z";
            weekOfYear = $"{fileInfo.LastWriteTime.Year}_Week_{weekOfYearValue:00}";
            foreach (string directoryName in directoryNames)
            {
                if (directoryName == year || directoryName == yearB || directoryName == yearC || directoryName == weekOfYear || directoryName == day)
                    continue;
                checkDirectory = Path.Combine(checkDirectory, directoryName);
            }
            if (string.IsNullOrEmpty(checkDirectory))
                continue;
            checkDirectory = Path.Combine(checkDirectory, yearC, weekOfYear, day);
            if (!Directory.Exists(checkDirectory))
                _ = Directory.CreateDirectory(checkDirectory);
            checkFile = Path.Combine(checkDirectory, fileInfo.Name);
            if (checkFile.Length > 256 || checkFile == fileInfo.FullName)
                continue;
            try
            {
                if (File.Exists(checkFile))
                    continue;
                File.Move(fileInfo.FullName, checkFile);
            }
            catch (Exception ex)
            { logger.LogInformation(ex, $"Inner loop error <{fileInfo.FullName}>!"); }
        }
        Helpers.HelperDeleteEmptyDirectories.DeleteEmptyDirectories(logger, sourceDirectory);
    }

}