using System.Text.Json; namespace View_by_Distance.Instance.Models; /// // List /// 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(); _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; if (_Configuration?.PropertyConfiguration is null) throw new NullReferenceException(nameof(_Configuration.PropertyConfiguration)); 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> fileKeyValuePairs) { string json; string jsonFile; Random random = new(); List relativePaths = new(); List 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 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); _ = Property.Models.Stateless.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); _ = Property.Models.Stateless.IPath.WriteAllText(jsonFile, json, updateDateWhenMatches: false, compareBeforeWrite: false); } } }