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; 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; } private static Dictionary> Get(Dictionary> personKeyToIds, Shared.Models.Mapping[] mappingCollection, string dateFormat) { Dictionary> results = new(); string key; long personKey; DateTime dateTime; List? personKeys; List? relativePaths; Dictionary> idToPersonKeys = Map.Models.Stateless.Methods.IMapLogic.GetIdToPersonKeys(personKeyToIds); foreach (Shared.Models.Mapping mapping in mappingCollection) { if (mapping.MappingFromItem.ImageFileHolder.DirectoryName is null || mapping.MappingFromPerson is null) continue; if (!idToPersonKeys.TryGetValue(mapping.MappingFromItem.Id, out personKeys)) continue; if (!personKeys.Contains(mapping.MappingFromPerson.PersonBirthday.Value.Ticks)) continue; personKey = mapping.MappingFromPerson.PersonBirthday.Value.Ticks; dateTime = new(personKey); key = dateTime.ToString(dateFormat); if (!results.TryGetValue(key, out relativePaths)) { results.Add(key, new()); if (!results.TryGetValue(key, out relativePaths)) throw new Exception(); } relativePaths.Add(mapping.MappingFromItem.RelativePath); } return results; } internal void Random(Property.Models.Configuration configuration, string outputResolution, Dictionary> personKeyToIds, Shared.Models.Mapping[] mappingCollection) { string key; string json; string jsonFile; Random random = new(); List? collection; string dateFormat = "MM-dd"; List relativePaths = new(); DateTime dateTime = new(2024, 1, 1); //Leap year Dictionary> dayToRelativePaths = Get(personKeyToIds, mappingCollection, dateFormat); 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 (Shared.Models.Mapping mapping in mappingCollection) { if (mapping.MappingFromItem.ImageFileHolder.DirectoryName is null) continue; if (_Configuration.IgnoreRelativePaths.Any(l => mapping.MappingFromItem.ImageFileHolder.DirectoryName.Contains(l)) && IsIgnoreRelativePath(mapping.MappingFromItem.ImageFileHolder.DirectoryName)) continue; relativePaths.Add(mapping.MappingFromItem.RelativePath); } if (relativePaths.Any()) { for (int i = 0; i < 366; i++) { key = dateTime.AddDays(i).ToString(dateFormat); if (dayToRelativePaths.TryGetValue(key, out collection) && collection.Count > 10) collection = (from l in collection orderby random.NextDouble() select l).ToList(); else collection = (from l in relativePaths orderby random.NextDouble() select l).ToList(); jsonFile = Path.Combine(fRandomCollectionDirectory, $"{key}.json"); json = JsonSerializer.Serialize(collection, _WriteIndentedJsonSerializerOptions); _ = Shared.Models.Stateless.Methods.IPath.WriteAllText(jsonFile, json, updateDateWhenMatches: false, compareBeforeWrite: false); if (!_Configuration.SaveFullYearOfRandomFiles) break; } } } }