using Phares.Shared; using System.Text.Json; using System.Text.Json.Serialization; using View_by_Distance.Property.Models; using View_by_Distance.Shared.Models; using View_by_Distance.Shared.Models.Methods; namespace View_by_Distance.Instance.Models; /// // List /// public class G2_Identify : Shared.Models.Properties.IIdentify, IIdentify { protected int _DirectoryCount; protected string _ParentDirectoryName; protected string _Person; protected string _PossibleYear; protected string _RelativePath; public int DirectoryCount => _DirectoryCount; public string ParentDirectoryName => _ParentDirectoryName; public string Person => _Person; public string PossibleYear => _PossibleYear; public string RelativePath => _RelativePath; private readonly Serilog.ILogger? _Log; private readonly Configuration _Configuration; private readonly JsonSerializerOptions _WriteIndentedJsonSerializerOptions; #nullable disable [JsonConstructor] public G2_Identify(int directoryCount, string parentDirectoryName, string person, string possibleYear, string relativePath) { _DirectoryCount = directoryCount; _ParentDirectoryName = parentDirectoryName; _Person = person; _PossibleYear = possibleYear; _RelativePath = relativePath; } internal G2_Identify(Configuration configuration) { _DirectoryCount = 0; _ParentDirectoryName = string.Empty; _Person = string.Empty; _PossibleYear = string.Empty; _RelativePath = string.Empty; _Configuration = configuration; _Log = Serilog.Log.ForContext(); _WriteIndentedJsonSerializerOptions = new JsonSerializerOptions { WriteIndented = true }; } public override string ToString() { string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true }); return result; } private FileInfo GetNamed() { FileInfo result; string[] jsonFiles = Directory.GetFiles(_Configuration.PropertyConfiguration.RootDirectory, "*Named*.json", SearchOption.TopDirectoryOnly); if (!jsonFiles.Any()) result = null; else result = new FileInfo(jsonFiles[0]); return result; } private void CheckLastWriteTimes(Property.Models.Configuration configuration, IsEnvironment isEnvironment, A2_People a2People, FileInfo named, string g2IdentifySingletonDirectory) { string json; FileInfo fileInfo; DateTime dateTime = DateTime.MinValue; string[] jsonFiles = Directory.GetFiles(g2IdentifySingletonDirectory, "*.json", SearchOption.AllDirectories); foreach (string jsonFile in jsonFiles) { fileInfo = new(jsonFile); if (dateTime < fileInfo.LastWriteTime) dateTime = fileInfo.LastWriteTime; } if (named.LastWriteTime > dateTime) { if (!isEnvironment.DebuggerWasAttachedDuringConstructor) throw new Exception("Only allowed when debugger is attached during constructor!"); foreach (string file in jsonFiles) File.Delete(file); } json = File.ReadAllText(named.FullName); Person[] people = a2People.GetPeople(configuration); Dictionary resultKeyValuePairs = new(); string[] peopleBirthdates = (from l in people select Shared.Models.Stateless.Methods.IPersonBirthday.GetFormated(l.Birthday)).ToArray(); Dictionary sourceKeyValuePairs = JsonSerializer.Deserialize>(json); foreach (KeyValuePair keyValuePair in sourceKeyValuePairs) { if (!(from l in keyValuePair.Value where peopleBirthdates.Contains(l) select false).Any()) continue; resultKeyValuePairs.Add(keyValuePair.Key, keyValuePair.Value); } if (resultKeyValuePairs.Count != sourceKeyValuePairs.Count) { json = JsonSerializer.Serialize(resultKeyValuePairs, _WriteIndentedJsonSerializerOptions); if (!isEnvironment.DebuggerWasAttachedDuringConstructor) throw new Exception("Only allowed when debugger is attached during constructor!"); _ = Property.Models.Stateless.IPath.WriteAllText(named.FullName, json, compareBeforeWrite: true); } } internal List GetIdentifiedCollection(Property.Models.Configuration configuration, IsEnvironment isEnvironment, A2_People a2People) { List results = new(); string json; string[] people; string[] jsonFiles; int directoryCount; string possibleYear; G2_Identify identify; FileInfo named = GetNamed(); string testDirectoryFullName; string checkDirectoryFullName; Dictionary keyValuePairs; List missing = new(); List indices = new(); string directoryName = Path.GetFileName(_Configuration.PropertyConfiguration.RootDirectory); string g2IdentifySingletonDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(configuration, nameof(G2_Identify), "[]"); string jsonRootDirectory = Path.Combine(string.Concat(_Configuration.PropertyConfiguration.RootDirectory, " - Copied"), string.Concat(directoryName, " - 4) Info"), _Configuration.PropertyConfiguration.DateGroup, "[]"); if (named is not null && named.Exists) CheckLastWriteTimes(configuration, isEnvironment, a2People, named, g2IdentifySingletonDirectory); if (Directory.Exists(jsonRootDirectory)) { jsonFiles = Directory.GetFiles(jsonRootDirectory, "*.json", SearchOption.AllDirectories); for (int i = 0; i < jsonFiles.Length; i++) { json = Shared.Models.Stateless.Methods.IIndex.GetJson(jsonFiles[i], fileInfo: null); indices.AddRange(JsonSerializer.Deserialize>(json)); } if (named is not null && named.Exists) { json = File.ReadAllText(named.FullName); keyValuePairs = JsonSerializer.Deserialize>(json); foreach (G_Index index in indices) { if (index?.Index is null) continue; if (!keyValuePairs.ContainsKey(index.Index.Value)) { missing.Add(index.Index.Value.ToString()); continue; } if (index.RelativePaths is null) { missing.Add(index.Index.Value.ToString()); continue; } people = keyValuePairs[index.Index.Value]; foreach (string relativePath in index.RelativePaths) { foreach (string person in people) { directoryCount = 0; checkDirectoryFullName = string.Concat(_Configuration.PropertyConfiguration.RootDirectory, relativePath); for (int i = 0; i < int.MaxValue; i++) { testDirectoryFullName = Path.GetDirectoryName(checkDirectoryFullName); if (testDirectoryFullName == _Configuration.PropertyConfiguration.RootDirectory) break; directoryCount += 1; checkDirectoryFullName = testDirectoryFullName; } possibleYear = checkDirectoryFullName.Split(' ').Last(); if (possibleYear.Length != 4) possibleYear = "0000"; identify = new G2_Identify(directoryCount, Path.GetFileName(checkDirectoryFullName), person, possibleYear, relativePath); results.Add(identify); } } } } } results = (from l in results orderby l.PossibleYear descending, l.DirectoryCount, l.ParentDirectoryName, l.RelativePath select l).ToList(); return results; } internal void WriteAllText(Property.Models.Configuration configuration, string outputResolution, List identifiedCollection) { string key; string json; string jsonFile; string directoryFullName; string fileNameWithoutExtension; string aPropertySingletonDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(configuration, nameof(A_Property), "{}"); string g2IdentifyCollectionDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(configuration, nameof(G2_Identify), "[]"); Dictionary>> keyValuePairs = new(); foreach (G2_Identify identified in identifiedCollection) { key = Path.GetDirectoryName(identified.RelativePath); if (!keyValuePairs.ContainsKey(key)) keyValuePairs.Add(key, new List>()); keyValuePairs[key].Add(new KeyValuePair(identified.RelativePath, identified.Person)); } foreach (KeyValuePair>> keyValuePair in keyValuePairs) { directoryFullName = string.Concat(aPropertySingletonDirectory, keyValuePair.Key); if (!Directory.Exists(directoryFullName)) continue; foreach (KeyValuePair keyValue in keyValuePair.Value) { fileNameWithoutExtension = Path.GetFileNameWithoutExtension(keyValue.Key); jsonFile = Path.Combine(directoryFullName, $"{fileNameWithoutExtension}.json"); if (!File.Exists(jsonFile)) { directoryFullName = string.Empty; break; } } if (string.IsNullOrEmpty(directoryFullName)) continue; directoryFullName = Path.GetDirectoryName(string.Concat(g2IdentifyCollectionDirectory, keyValuePair.Key)); if (!Directory.Exists(directoryFullName)) _ = Directory.CreateDirectory(directoryFullName); jsonFile = string.Concat(g2IdentifyCollectionDirectory, keyValuePair.Key, ".json"); json = JsonSerializer.Serialize(keyValuePair.Value, _WriteIndentedJsonSerializerOptions); if (!Property.Models.Stateless.IPath.WriteAllText(jsonFile, json, compareBeforeWrite: true)) continue; } } }