using Microsoft.Extensions.Logging;
using System.Text.RegularExpressions;

namespace File_Folder_Helper.ADO2024.PI1;

internal static partial class Helper20240404
{

    private record MetaData(int DeviceId,
                            string DeviceType,
                            int DeviceNumber,
                            string DescriptionName,
                            string DescriptionTest,
                            string Frequency,
                            string Date);

    private record CommaSeparatedValuesConfiguration(int Columns,
                                                     string Directory,
                                                     int TestIndex,
                                                     int RegularExpressionGroupCount,
                                                     string RegularExpressionPattern,
                                                     string SearchPattern);

    private static void ParseCSV(CommaSeparatedValuesConfiguration commaSeparatedValuesConfiguration, ILogger<Worker> logger)
    {
        string line;
        string test;
        string[] lines;
        string[] columns;
        MetaData? metaData;
        string fileNameWithoutExtension;
        string[] files = Directory.GetFiles(commaSeparatedValuesConfiguration.Directory, commaSeparatedValuesConfiguration.SearchPattern, SearchOption.TopDirectoryOnly);
        logger.LogInformation(files.Length.ToString());
        foreach (string file in files)
        {
            fileNameWithoutExtension = Path.GetFileNameWithoutExtension(file);
            metaData = GetMetaData(commaSeparatedValuesConfiguration, fileNameWithoutExtension);
            if (metaData is null)
                continue;
            lines = File.ReadAllLines(file);
            if (lines.Length < 2)
                continue;
            line = lines[0];
            columns = line.Split('"');
            if (columns.Length != commaSeparatedValuesConfiguration.Columns)
                continue;
            test = columns[commaSeparatedValuesConfiguration.TestIndex].Trim().Trim('"');
            if (test.IndexOf(metaData.DescriptionTest, 0, StringComparison.CurrentCultureIgnoreCase) == -1)
                continue;
            for (int i = 1; i < lines.Length; i++)
            {
                line = lines[i];
                if (line.Length < 1)
                    continue;
                columns = line.Split(',').Select(l => l.Trim().Trim('"')).ToArray();
                if (columns.Length != commaSeparatedValuesConfiguration.Columns)
                    continue;
            }
        }
    }

    internal static void ParseCSV(ILogger<Worker> logger, List<string> args)
    {
        string directory = args[0];
        string regularExpressionPattern = args[2];
        string regularExpressionGroupCount = args[3];
        string searchPattern = args[4];
        string columns = args[5];
        string testIndex = args[6];
        logger.LogInformation(directory);
        CommaSeparatedValuesConfiguration commaSeparatedValuesConfiguration = new(int.Parse(columns), directory, int.Parse(testIndex), int.Parse(regularExpressionGroupCount), regularExpressionPattern, searchPattern);
        ParseCSV(commaSeparatedValuesConfiguration, logger);
    }

    private static MetaData? GetMetaData(CommaSeparatedValuesConfiguration commaSeparatedValuesConfiguration, string fileNameWithoutExtension)
    {
        MetaData? result;
        Match match = Regex.Match(fileNameWithoutExtension, commaSeparatedValuesConfiguration.RegularExpressionPattern);
        if (!match.Success || match.Groups.Count != commaSeparatedValuesConfiguration.RegularExpressionGroupCount)
            result = null;
        else
        {
            int deviceId = int.Parse(match.Groups["DeviceId"].Value);
            int deviceNumber = int.Parse(match.Groups["DeviceNumber"].Value);
            result = new(deviceId,
                         match.Groups["DeviceType"].Value,
                         deviceNumber,
                         match.Groups["DescriptionName"].Value,
                         match.Groups["DescriptionTest"].Value,
                         match.Groups["Frequency"].Value,
                         match.Groups["Date"].Value);
        }
        return result;
    }

}