using File_Folder_Helper.Models;
using Microsoft.Extensions.Logging;
using System.Text.Json;

namespace File_Folder_Helper.Helpers;

internal static class HelperPackageFilesByDate
{

    internal static void SetDateFromJsonEntry(ILogger log, string sourceDirectory, SearchOption searchOption = SearchOption.AllDirectories)
    {
        string json;
        DateTime dateTime;
        FileInfo fileInfo;
        string[] segments;
        string[] tgzFiles;
        PackageJson? packageJson;
        string[] packageJsonFiles;
        string? packageJsonDirectory;
        List<DateTime> dateTimes = [];
        string fileNameWithoutExtension;
        string packageJsonDirectoryName;
        if (log is null)
            throw new NullReferenceException();
        if (!Directory.Exists(sourceDirectory))
            _ = Directory.CreateDirectory(sourceDirectory);
        for (int i = 1; i < 2; i++)
        {
            packageJsonFiles = Directory.GetFiles(sourceDirectory, "package.json", searchOption);
            foreach (string packageJsonFile in packageJsonFiles)
            {
                packageJsonDirectory = Path.GetDirectoryName(packageJsonFile);
                if (string.IsNullOrEmpty(packageJsonDirectory))
                    continue;
                json = File.ReadAllText(packageJsonFile);
                packageJson = JsonSerializer.Deserialize(json, PackageJsonSourceGenerationContext.Default.PackageJson);
                if (packageJson is null || packageJson.Times.Count == 0)
                    continue;
                packageJsonDirectoryName = Path.GetFileName(packageJsonDirectory);
                tgzFiles = Directory.GetFiles(packageJsonDirectory, "*.tgz", SearchOption.TopDirectoryOnly);
                foreach (string tgzFile in tgzFiles)
                {
                    dateTimes.Clear();
                    fileNameWithoutExtension = Path.GetFileNameWithoutExtension(tgzFile);
                    segments = fileNameWithoutExtension.Split('-');
                    foreach (string segment in segments)
                    {
                        if (!packageJson.Times.TryGetValue(segment, out dateTime))
                            continue;
                        dateTimes.Add(dateTime);
                        fileInfo = new(tgzFile);
                        if (fileInfo.LastWriteTime != dateTime)
                            File.SetLastWriteTime(fileInfo.FullName, dateTime);
                    }
                    if (dateTimes.Count == 0)
                    {
                        if (fileNameWithoutExtension.Length + 1 < packageJsonDirectoryName.Length)
                            continue;
                        if (!packageJson.Times.TryGetValue(fileNameWithoutExtension[(packageJsonDirectoryName.Length + 1)..], out dateTime))
                            continue;
                        dateTimes.Add(dateTime);
                        fileInfo = new(tgzFile);
                        if (fileInfo.LastWriteTime != dateTime)
                            File.SetLastWriteTime(fileInfo.FullName, dateTime);
                    }
                }
                if (dateTimes.Count == 0)
                    continue;
                dateTime = dateTimes.Max();
                fileInfo = new(packageJsonFile);
                if (fileInfo.LastWriteTime != dateTime)
                    File.SetLastWriteTime(fileInfo.FullName, dateTime);
            }
        }
    }

}