using Microsoft.Extensions.Logging;
using System.Collections.ObjectModel;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace File_Folder_Helper.ADO2024.PI3;

internal static partial class Helper20240925
{

    private record Test(string Name,
                        long Value);

    [JsonSourceGenerationOptions(WriteIndented = true)]
    [JsonSerializable(typeof(ReadOnlyCollection<Test>))]
    private partial class TestCollectionSourceGenerationContext : JsonSerializerContext
    {
    }

    private static ReadOnlyCollection<Test> GetTests(string sourceDirectory, string searchPattern, string searchPatternB)
    {
        List<Test> results = [];
        long test;
        string[] lines;
        string[] segments;
        string[] segmentsB;
        List<long> distinct = [];
        string[] files = Directory.GetFiles(sourceDirectory, searchPattern, SearchOption.AllDirectories);
        foreach (string file in files)
        {
            lines = File.ReadAllLines(file);
            foreach (string line in lines)
            {
                segments = line.Split(searchPatternB);
                if (segments.Length < 2)
                    continue;
                segmentsB = segments[1].Split(',');
                if (segmentsB.Length < 2)
                    continue;
                if (!long.TryParse(segmentsB[0], out test))
                    continue;
                if (distinct.Contains(test))
                    continue;
                distinct.Add(test);
                results.Add(new(segmentsB[1].Trim('"'), test));
            }
        }
        return (from l in results orderby l.Name.Length, l.Name select l).ToArray().AsReadOnly();
    }

    internal static void DistinctTests(ILogger<Worker> logger, List<string> args)
    {
        string searchPattern = args[2];
        string searchPatternB = args[3];
        string destinationDirectory = args[4];
        string sourceDirectory = Path.GetFullPath(args[0]);
        if (!Directory.Exists(destinationDirectory))
            _ = Directory.CreateDirectory(destinationDirectory);
        ReadOnlyCollection<Test> tests = GetTests(sourceDirectory, searchPattern, searchPatternB);
        logger.LogInformation("Found {files} file(s)", tests.Count);
        string json = JsonSerializer.Serialize(tests, TestCollectionSourceGenerationContext.Default.ReadOnlyCollectionTest);
        string fileName = Path.Combine(destinationDirectory, ".json");
        File.WriteAllText(fileName, json);
    }

}