using System.Text.Json;

namespace View_by_Distance.Instance.Models;

/// <summary>
// List<string>
/// </summary>
internal class F_Random
{

    private readonly Serilog.ILogger? _Log;
    private readonly Configuration _Configuration;
    private readonly JsonSerializerOptions _WriteIndentedJsonSerializerOptions;

    internal F_Random(Configuration configuration)
    {
        _Configuration = configuration;
        _Log = Serilog.Log.ForContext<F_Random>();
        _WriteIndentedJsonSerializerOptions = new JsonSerializerOptions { WriteIndented = false };
    }

    public override string ToString()
    {
        string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true });
        return result;
    }

    private bool IsIgnoreRelativePath(string directory)
    {
        bool result = false;
        string? checkDirectory = Path.GetFullPath(directory);
        for (int i = 0; i < int.MaxValue; i++)
        {
            if (_Configuration.IgnoreRelativePaths.Contains(Path.GetFileName(checkDirectory)))
            {
                result = true;
                break;
            }
            checkDirectory = Path.GetDirectoryName(checkDirectory);
            if (string.IsNullOrEmpty(checkDirectory) || checkDirectory == _Configuration.PropertyConfiguration.RootDirectory)
                break;
        }
        return result;
    }

    internal void Random(Property.Models.Configuration configuration, string outputResolution, List<KeyValuePair<string, string>> fileKeyValuePairs)
    {
        string json;
        string jsonFile;
        Random random = new();
        List<string> relativePaths = new();
        List<string> ignoreRelativePaths = new();
        DateTime dateTime = new(2024, 1, 1); //Leap year            
        string fRandomCollectionDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(configuration, nameof(F_Random), "[]");
        string[] files = Directory.GetFiles(fRandomCollectionDirectory, "*", SearchOption.TopDirectoryOnly);
        foreach (string file in files)
            File.Delete(file);
        foreach (KeyValuePair<string, string> keyValuePair in fileKeyValuePairs)
        {
            if (!(from l in _Configuration.IgnoreRelativePaths where keyValuePair.Key.Contains(l) && IsIgnoreRelativePath(keyValuePair.Key) select true).Any())
                relativePaths.Add(keyValuePair.Value);
            else
                ignoreRelativePaths.Add(keyValuePair.Value);
        }
        if (relativePaths.Any())
        {
            for (int i = 0; i < 366; i++)
            {
                relativePaths = (from l in relativePaths orderby random.NextDouble() select l).ToList();
                jsonFile = Path.Combine(fRandomCollectionDirectory, $"{dateTime.AddDays(i):MM-dd}.json");
                json = JsonSerializer.Serialize(relativePaths, _WriteIndentedJsonSerializerOptions);
                _ = Shared.Models.Stateless.Methods.IPath.WriteAllText(jsonFile, json, updateDateWhenMatches: false, compareBeforeWrite: false);
                if (!_Configuration.SaveFullYearOfRandomFiles)
                    break;
            }
        }
        if (ignoreRelativePaths.Any())
        {
            ignoreRelativePaths = (from l in ignoreRelativePaths orderby random.NextDouble() select l).ToList();
            jsonFile = Path.Combine(fRandomCollectionDirectory, "01-01.txt");
            json = JsonSerializer.Serialize(ignoreRelativePaths, _WriteIndentedJsonSerializerOptions);
            _ = Shared.Models.Stateless.Methods.IPath.WriteAllText(jsonFile, json, updateDateWhenMatches: false, compareBeforeWrite: false);
        }
    }

}