using System.Globalization;

namespace File_Folder_Helper.Helpers;

internal static class HelperLogMerge
{

    internal static void LogMerge(string argsZero)
    {
        int hour;
        string day;
        string logFile;
        FileInfo fileInfo;
        string[] segments;
        string checkDirectory;
        List<string> lines = [];
        string format = "yyyyMMdd";
        List<string> moveFiles = [];
        string segment1 = string.Empty;
        string sourceFileNameWithoutExtension;
        DateTime dateTime = DateTime.Now.AddMinutes(2);
        string[] sourceFiles = Directory.GetFiles(argsZero, "*.log", SearchOption.TopDirectoryOnly);
        Dictionary<string, Dictionary<int, string[]>> keyValuePairs = [];
        foreach (string sourceFile in sourceFiles)
        {
            sourceFileNameWithoutExtension = Path.GetFileNameWithoutExtension(sourceFile);
            if (sourceFileNameWithoutExtension.Split('-').Length > 2)
                continue;
            if (sourceFileNameWithoutExtension.StartsWith(dateTime.ToString(format)))
                continue;
            fileInfo = new FileInfo(sourceFile);
            if (fileInfo.Length == 0)
                moveFiles.Add(sourceFile);
            day = sourceFileNameWithoutExtension[..8];
            if (!keyValuePairs.ContainsKey(day))
                keyValuePairs.Add(day, []);
            if (sourceFileNameWithoutExtension.Substring(8, 1) == "_")
                continue;
            segments = sourceFileNameWithoutExtension.Split('_');
            if (!string.IsNullOrEmpty(segment1) && segment1 != segments[1])
                continue;
            segment1 = segments[1];
            hour = int.Parse(sourceFileNameWithoutExtension.Substring(8, 2));
            if (keyValuePairs[day].TryGetValue(hour, out _))
                continue;
            keyValuePairs[day].Add(hour, File.ReadAllLines(sourceFile));
            moveFiles.Add(sourceFile);
        }
        if (!string.IsNullOrEmpty(segment1))
        {
            foreach (KeyValuePair<string, Dictionary<int, string[]>> keyValuePair in keyValuePairs)
            {
                lines.Clear();
                dateTime = DateTime.ParseExact(keyValuePair.Key, format, CultureInfo.InvariantCulture);
                foreach (KeyValuePair<int, string[]> item in keyValuePair.Value.OrderBy(l => l.Key))
                    lines.AddRange(item.Value);
                logFile = Path.Combine(argsZero, $"{dateTime:yyyy-MM-dd}_{segment1}.log");
                File.WriteAllLines(logFile, lines);
                if (dateTime.Hour == 0 && dateTime.Minute == 0 && dateTime.Second == 0 && dateTime.Millisecond == 0)
                    _ = dateTime.AddHours(23).AddMinutes(59).AddSeconds(59);
                File.SetLastWriteTime(logFile, dateTime);
            }
            checkDirectory = Path.Combine(argsZero, "_ Merged");
            if (!Directory.Exists(checkDirectory))
                _ = Directory.CreateDirectory(checkDirectory);
            foreach (string moveFile in moveFiles.Distinct())
                File.Move(moveFile, Path.Combine(checkDirectory, Path.GetFileName(moveFile)));
        }
    }

}