using Microsoft.Extensions.Logging;

namespace File_Folder_Helper.Helpers;

internal static class HelperTooLong
{

    internal static void TooLong(string workingDirectory, bool delete)
    {
        string[] files;
        string destination;
        string? parentDirectory;
        string[] directories = Directory.GetDirectories(workingDirectory, "*", SearchOption.TopDirectoryOnly);
        for (int i = 0; i < directories.Length; i++)
        {
            if (delete)
            {
                Directory.Delete(directories[i], recursive: true);
                break;
            }
            files = Directory.GetFiles(directories[i], "*", SearchOption.TopDirectoryOnly);
            for (int f = 0; f < files.Length; f++)
                File.Delete(files[f]);
            parentDirectory = Path.GetDirectoryName(directories[i]);
            if (string.IsNullOrEmpty(parentDirectory))
                continue;
            destination = Path.Combine(parentDirectory, i.ToString());
            if (Path.GetFileName(directories[i]).Length > 3)
                Directory.Move(directories[i], destination);
            TooLong(destination, delete);
        }
    }

    private static void MoveFiles(string yearName, string personKeyFormattedDirectory, string personNameDirectory, string personNameDirectoryName)
    {
        string? checkFile;
        string? checkDirectory;
        string[] files = Directory.GetFiles(personNameDirectory, "*", SearchOption.TopDirectoryOnly);
        foreach (string file in files)
        {
            checkDirectory = Path.Combine(personKeyFormattedDirectory, yearName, personNameDirectoryName);
            if (!Directory.Exists(checkDirectory))
                _ = Directory.CreateDirectory(checkDirectory);
            checkFile = Path.Combine(checkDirectory, Path.GetFileName(file));
            if (File.Exists(checkFile))
                continue;
            File.Move(file, checkFile);
        }
    }

    private static void MaybeMoveFiles(Models.AppSettings appSettings, string[] ticksDirectories)
    {
        string yearName;
        string yearDirectoryName;
        string[] yearDirectories;
        string personKeyFormatted;
        string ticksDirectoryName;
        string personNameDirectoryName;
        string[] personNameDirectories;
        string[] personKeyFormattedDirectories;
        foreach (string ticksDirectory in ticksDirectories)
        {
            ticksDirectoryName = Path.GetFileName(ticksDirectory);
            if (!long.TryParse(ticksDirectoryName, out long directoryTicks))
                break;
            yearName = new DateTime(directoryTicks).Year.ToString();
            personKeyFormattedDirectories = Directory.GetDirectories(ticksDirectory, "*", SearchOption.TopDirectoryOnly);
            foreach (string personKeyFormattedDirectory in personKeyFormattedDirectories)
            {
                personKeyFormatted = Path.GetFileName(personKeyFormattedDirectory);
                if (personKeyFormatted.Length != appSettings.PersonBirthdayFormat.Length)
                    break;
                yearDirectories = Directory.GetDirectories(personKeyFormattedDirectory, "*", SearchOption.TopDirectoryOnly);
                foreach (string yearDirectory in yearDirectories)
                {
                    personNameDirectories = Directory.GetDirectories(yearDirectory, "*", SearchOption.TopDirectoryOnly);
                    if (personNameDirectories.Length > 1)
                        break;
                    if (personNameDirectories.Length == 0)
                        continue;
                    personNameDirectoryName = Path.GetFileName(personNameDirectories[0]);
                    if (!personNameDirectoryName.StartsWith("X+") && personNameDirectoryName.Length != 1)
                        break;
                    yearDirectoryName = Path.GetFileName(yearDirectory);
                    if (yearDirectoryName == yearName)
                        continue;
                    MoveFiles(yearName, personKeyFormattedDirectory, personNameDirectories[0], personNameDirectoryName);
                }
            }
        }
    }

    internal static void UpdateDateVerifyAndGetTicksDirectories(ILogger<Worker> logger, Models.AppSettings appSettings, string directory)
    {
        string ticksDirectoryName;
        DirectoryInfo directoryInfo;
        string[] ticksDirectories = Directory.GetDirectories(directory, "*", SearchOption.TopDirectoryOnly);
        foreach (string ticksDirectory in ticksDirectories)
        {
            ticksDirectoryName = Path.GetFileName(ticksDirectory);
            if (ticksDirectoryName.Length < 3)
                break;
            if (!long.TryParse(ticksDirectoryName, out long directoryTicks))
                break;
            directoryInfo = new(ticksDirectory);
            if (directoryInfo.CreationTime.Ticks != directoryTicks)
                Directory.SetCreationTime(ticksDirectory, new DateTime(directoryTicks));
            if (directoryInfo.LastWriteTime.Ticks != directoryTicks)
                Directory.SetLastWriteTime(ticksDirectory, new DateTime(directoryTicks));
        }
        MaybeMoveFiles(appSettings, ticksDirectories);
        HelperDeleteEmptyDirectories.DeleteEmptyDirectories(logger, directory);
    }

}