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

namespace File_Folder_Helper.Helpers;

internal static class HelperHardcodedFileSearchAndSort
{

    internal static void HardcodedFileSearchAndSort(ILogger log, string sourceDirectory, SearchOption searchOption = SearchOption.TopDirectoryOnly)
    {
        bool check;
        string lines;
        string checkFile;
        string? directory;
        FileInfo fileInfo;
        string weekOfYear;
        string checkDirectory;
        CultureInfo cultureInfo = new("en-US");
        Calendar calendar = cultureInfo.Calendar;
        string[] hardcodedValues = new string[]
        {
            "BIORAD2",
            "BIORAD3",
            "BIORAD4",
            "BIORAD5",
            "CDE2",
            "CDE3",
            "CDE4",
            "CDE5",
            "CDE6",
            "HGCV1",
            "HGCV2",
            "HGCV3",
            "TENCOR1",
            "TENCOR2",
            "TENCOR3",
            "SP101",
            "SPV01",
            "SRP",
            "WC6Inch",
            "WC8Inch",
            "Bio-Rad"
        };
        string[] files = Directory.GetFiles(sourceDirectory, "*", searchOption);
        foreach (string file in files)
        {
            directory = Path.GetDirectoryName(file);
            if (string.IsNullOrEmpty(directory))
                continue;
            check = false;
            fileInfo = new(file);
            weekOfYear = calendar.GetWeekOfYear(fileInfo.LastWriteTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00");
            for (int i = 1; i < 3; i++)
            {
                if (check)
                    break;
                lines = i switch
                {
                    1 => fileInfo.Name,
                    2 => File.ReadAllText(file),
                    _ => throw new NotImplementedException()
                };
                foreach (string hardcodedValue in hardcodedValues)
                {
                    if (!lines.Contains(hardcodedValue))
                        continue;
                    checkDirectory = Path.Combine(directory, $"{fileInfo.LastWriteTime:yyyy}_Week_{weekOfYear}", fileInfo.LastWriteTime.ToString("yyyy-MM-dd"), hardcodedValue);
                    if (!Directory.Exists(checkDirectory))
                        _ = Directory.CreateDirectory(checkDirectory);
                    checkFile = Path.Combine(checkDirectory, Path.GetFileName(file));
                    if (File.Exists(checkFile) || !File.Exists(file))
                        continue;
                    try
                    { File.Move(file, checkFile); }
                    catch (Exception) { }
                    check = true;
                    break;
                }
            }
        }
        log.LogInformation("{sourceDirectory}", sourceDirectory);
    }

}