using System.Globalization; using System.Text.Json; using View_by_Distance.Shared.Models; namespace View_by_Distance.Map.Models.Stateless; public class ByDeterministicHashCode { private static void SetOther(string resizeFilenameExtension, Person[] people, string deterministicHashCodePeopleDirectory, List skipCollection, List<(string, int?, string, PersonBirthday[])> peopleCollection) { string json; string personKey; string[] segments; int? approximateYears; string groupDirectoryName; string personKeyJsonFileName; string[] personKeyDirectories; string personKeyJsonDirectory; PersonBirthday? personBirthday; List personKeys = new(); string[] personDisplayDirectories; string convertedPersonKeyDirectory; string? personDisplayDirectoryName; List personBirthdays; Dictionary personKeyValuePairs = new(); foreach (Person person in people) { personKey = Shared.Models.Stateless.Methods.IPersonBirthday.GetFormatted(person.Birthday); if (personKeyValuePairs.ContainsKey(personKey)) break; personKeyValuePairs.Add(personKey, person); } string[] groupDirectories = Directory.GetDirectories(deterministicHashCodePeopleDirectory, "*", SearchOption.TopDirectoryOnly); foreach (string groupDirectory in groupDirectories) { groupDirectoryName = Path.GetFileName(groupDirectory); if (groupDirectoryName[0] == '!') { skipCollection.AddRange(from l in Directory.GetFiles(groupDirectory, $"*{resizeFilenameExtension}", SearchOption.AllDirectories) select double.Parse(Path.GetFileNameWithoutExtension(l))); continue; } else if (groupDirectoryName[0] is not '_' and not '~' and not '^') continue; skipCollection.AddRange(from l in Directory.GetFiles(groupDirectory, $"*{resizeFilenameExtension}", SearchOption.AllDirectories) select double.Parse(Path.GetFileNameWithoutExtension(l))); personDisplayDirectories = Directory.GetDirectories(groupDirectory, "*", SearchOption.TopDirectoryOnly); foreach (string personDisplayDirectory in personDisplayDirectories) { personBirthdays = new(); personDisplayDirectoryName = Path.GetFileName(personDisplayDirectory); if (string.IsNullOrEmpty(personDisplayDirectoryName)) continue; if (groupDirectoryName[0] != '~') approximateYears = null; else { segments = personDisplayDirectoryName.Split('~'); if (segments.Length == 1 || !int.TryParse(segments[1].Split('-')[0], out int years)) approximateYears = null; else approximateYears = years; } personKeyDirectories = Directory.GetDirectories(personDisplayDirectory, "*", SearchOption.TopDirectoryOnly); foreach (string personKeyDirectory in personKeyDirectories) { personKey = Path.GetFileName(personKeyDirectory); if (!DateTime.TryParseExact(personKey, "MM.dd.yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime birthday)) personBirthday = Shared.Models.Stateless.Methods.IPersonBirthday.GetPersonBirthday(personKey); else { personBirthday = new PersonBirthday(birthday); personKey = Shared.Models.Stateless.Methods.IPersonBirthday.GetFormatted(personBirthday); convertedPersonKeyDirectory = Path.Combine(personDisplayDirectory, personKey); if (!Directory.Exists(convertedPersonKeyDirectory)) Directory.Move(personKeyDirectory, convertedPersonKeyDirectory); } if (personBirthday is null) continue; personBirthdays.Add(personBirthday); } foreach (string personKeyDirectory in personKeyDirectories) { personKey = Path.GetFileName(personKeyDirectory); personBirthday = Shared.Models.Stateless.Methods.IPersonBirthday.GetPersonBirthday(personKey); if (personBirthday is null) continue; if (personKeyValuePairs.ContainsKey(personKey)) { personKeyJsonDirectory = Path.Combine(personDisplayDirectory, personKey); if (!Directory.Exists(personKeyJsonDirectory)) Directory.Move(personKeyDirectory, personKeyJsonDirectory); personKeyJsonFileName = Path.Combine(personKeyJsonDirectory, $"{personKey}.json"); json = JsonSerializer.Serialize(personKeyValuePairs[personKey], new JsonSerializerOptions() { WriteIndented = true }); _ = Shared.Models.Stateless.Methods.IPath.WriteAllText(personKeyJsonFileName, json, updateDateWhenMatches: false, compareBeforeWrite: true, updateToWhenMatches: null); } personKeys.Add(personKey); peopleCollection.Add(new(personDisplayDirectoryName, approximateYears, personKey, personBirthdays.OrderByDescending(l => l.Value).ToArray())); } } } approximateYears = null; const string displayDirectoryName = Property.Models.Stateless.IResult.AllInOne; DateTime incrementDate = new(Shared.Models.Stateless.IPersonBirthday.FirstYear, 1, 1); for (int i = 0; i < 500; i++) { incrementDate = incrementDate.AddDays(1); personBirthday = new(incrementDate); personKey = Shared.Models.Stateless.Methods.IPersonBirthday.GetFormatted(personBirthday); if (personKeys.Contains(personKey)) continue; personKeys.Add(personKey); peopleCollection.Add(new(displayDirectoryName, approximateYears, personKey, new PersonBirthday[] { personBirthday })); } } internal static void SetKeyValuePairs(string deterministicHashCodeContentDirectory, List<(string, double)> deterministicHashCodeCollection, List<(string, double)> incorrectDeterministicHashCodeCollection, Dictionary> keyValuePairs) { string[] files; string personKey; string[] yearDirectories; string ticksDirectoryName; string? personFirstInitial; string[] personKeyDirectories; string[] personNameDirectories; string[] personNameLinkDirectories; string? personFirstInitialDirectory; double? reversedDeterministicHashCodeKey; bool keyValuePairsAny = keyValuePairs.Any(); string[] ticksDirectories = Directory.GetDirectories(deterministicHashCodeContentDirectory, "*", SearchOption.TopDirectoryOnly); foreach (string ticksDirectory in ticksDirectories) { ticksDirectoryName = Path.GetFileName(ticksDirectory); if (ticksDirectoryName.Length < 3 || ticksDirectoryName[0] != '(' || ticksDirectoryName[^1] != ')') continue; personKeyDirectories = Directory.GetDirectories(ticksDirectory, "*", SearchOption.TopDirectoryOnly); foreach (string personKeyDirectory in personKeyDirectories) { personKey = Path.GetFileName(personKeyDirectory); if (personKey == nameof(Closest)) throw new Exception($"Move personKey directories up one from {nameof(Closest)} and delete {nameof(Closest)} directory!"); yearDirectories = Directory.GetDirectories(personKeyDirectory, "*", SearchOption.TopDirectoryOnly); foreach (string yearDirectory in yearDirectories) { files = Directory.GetFiles(yearDirectory, "*", SearchOption.TopDirectoryOnly); personNameDirectories = Directory.GetDirectories(yearDirectory, "*", SearchOption.TopDirectoryOnly); foreach (string file in files) File.Delete(file); foreach (string personNameDirectory in personNameDirectories) { personFirstInitial = Path.GetFileName(personNameDirectory)[..1]; if (personFirstInitial is null) continue; personFirstInitialDirectory = Path.Combine(yearDirectory, personFirstInitial); files = Directory.GetFiles(personNameDirectory, "*", SearchOption.TopDirectoryOnly); foreach (string file in files) { if (file.EndsWith(".lnk") || file.EndsWith(".json")) continue; reversedDeterministicHashCodeKey = Shared.Models.Stateless.Methods.IMapping.GetReversedDeterministicHashCodeKey(keyValuePairsAny, keyValuePairs, file); if (reversedDeterministicHashCodeKey is null) continue; deterministicHashCodeCollection.Add(new(personKey, reversedDeterministicHashCodeKey.Value)); } personNameLinkDirectories = Directory.GetDirectories(personNameDirectory, "*", SearchOption.TopDirectoryOnly); foreach (string personNameLinkDirectory in personNameLinkDirectories) { files = Directory.GetFiles(personNameLinkDirectory, "*", SearchOption.TopDirectoryOnly); foreach (string file in files) { if (!file.EndsWith(".lnk")) continue; File.Delete(file); } _ = Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(personNameLinkDirectory); } if (personNameDirectory == personFirstInitialDirectory) continue; Directory.Move(personNameDirectory, personFirstInitialDirectory); _ = Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(personNameDirectory); } _ = Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(yearDirectory); } _ = Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(personKeyDirectory); } _ = Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(ticksDirectory); } } internal static string SetByRef(string resizeFilenameExtension, Person[] people, List skipCollection, Dictionary peopleKeyValuePairs, List notMappedPersonKeys, Dictionary deterministicHashCodeUnknownFaceKeyValuePairs, Dictionary deterministicHashCodeKeyValuePairs, Dictionary incorrectDeterministicHashCodeKeyValuePairs, string deterministicHashCodeRootDirectory) { string result; string[] distinctPersonKeys; Dictionary> keyValuePairs = new(); List deterministicHashCodePersonKeys = new(); List deterministicHashCodeUnknownFacePersonKeys = new(); Dictionary> deterministicHashCodeScope = new(); Dictionary> incorrectDeterministicHashCodeScope = new(); List<(string PersonKey, double IdAndNormalizedPixelPercentage)> deterministicHashCodeCollection = new(); string deterministicHashCodePeopleDirectory = Path.Combine(deterministicHashCodeRootDirectory, "People"); List<(string PersonKey, double IdAndNormalizedPixelPercentage)> incorrectDeterministicHashCodeCollection = new(); foreach (KeyValuePair keyValuePair in deterministicHashCodeUnknownFaceKeyValuePairs) deterministicHashCodeUnknownFacePersonKeys.AddRange(keyValuePair.Value); deterministicHashCodeUnknownFacePersonKeys = deterministicHashCodeUnknownFacePersonKeys.Distinct().ToList(); List<(string, int?, string, PersonBirthday[])> peopleCollection = new(); if (!Directory.Exists(deterministicHashCodePeopleDirectory)) _ = Directory.CreateDirectory(deterministicHashCodePeopleDirectory); else SetOther(resizeFilenameExtension, people, deterministicHashCodePeopleDirectory, skipCollection, peopleCollection); result = Path.Combine(deterministicHashCodeRootDirectory, "()"); if (!Directory.Exists(result)) _ = Directory.CreateDirectory(result); SetKeyValuePairs(result, deterministicHashCodeCollection, incorrectDeterministicHashCodeCollection, keyValuePairs); deterministicHashCodeCollection = (from l in deterministicHashCodeCollection orderby l.IdAndNormalizedPixelPercentage select l).ToList(); incorrectDeterministicHashCodeCollection = (from l in incorrectDeterministicHashCodeCollection orderby l.IdAndNormalizedPixelPercentage select l).ToList(); foreach ((string personKey, double idAndNormalizedPixelPercentage) in deterministicHashCodeCollection) { if (!deterministicHashCodeScope.ContainsKey(idAndNormalizedPixelPercentage)) deterministicHashCodeScope.Add(idAndNormalizedPixelPercentage, new()); deterministicHashCodeScope[idAndNormalizedPixelPercentage].Add(personKey); deterministicHashCodePersonKeys.Add(personKey); } deterministicHashCodePersonKeys = deterministicHashCodePersonKeys.Distinct().ToList(); foreach ((string personKey, double idAndNormalizedPixelPercentage) in incorrectDeterministicHashCodeCollection) { if (!incorrectDeterministicHashCodeScope.ContainsKey(idAndNormalizedPixelPercentage)) incorrectDeterministicHashCodeScope.Add(idAndNormalizedPixelPercentage, new()); incorrectDeterministicHashCodeScope[idAndNormalizedPixelPercentage].Add(personKey); } foreach (KeyValuePair> keyValuePair in deterministicHashCodeScope) { distinctPersonKeys = keyValuePair.Value.Distinct().ToArray(); deterministicHashCodeKeyValuePairs.Add(keyValuePair.Key, distinctPersonKeys); } foreach (KeyValuePair> keyValuePair in incorrectDeterministicHashCodeScope) incorrectDeterministicHashCodeKeyValuePairs.Add(keyValuePair.Key, keyValuePair.Value.Distinct().ToArray()); if (peopleCollection.Any()) { foreach ((string displayDirectoryName, int? approximateYears, string personKey, PersonBirthday[] personBirthdays) in peopleCollection) { if (peopleKeyValuePairs.ContainsKey(personKey) && peopleKeyValuePairs[personKey].Item1 != displayDirectoryName) throw new NotImplementedException(); if (deterministicHashCodeUnknownFacePersonKeys.Contains(personKey) || deterministicHashCodePersonKeys.Contains(personKey)) peopleKeyValuePairs.Add(personKey, new(displayDirectoryName, approximateYears, personKey, personBirthdays)); else notMappedPersonKeys.Add(personKey); } } if (deterministicHashCodeUnknownFacePersonKeys.Any() || deterministicHashCodePersonKeys.Any()) { int? approximateYears = null; PersonBirthday? personBirthday; const string displayDirectoryName = Property.Models.Stateless.IResult.AllInOne; foreach (string personKey in deterministicHashCodeUnknownFacePersonKeys) { if (!peopleKeyValuePairs.ContainsKey(personKey)) { personBirthday = Shared.Models.Stateless.Methods.IPersonBirthday.GetPersonBirthday(personKey); if (personBirthday is null) continue; peopleKeyValuePairs.Add(personKey, new(displayDirectoryName, approximateYears, personKey, new PersonBirthday[] { personBirthday })); } } foreach (string personKey in deterministicHashCodePersonKeys) { if (!peopleKeyValuePairs.ContainsKey(personKey)) { personBirthday = Shared.Models.Stateless.Methods.IPersonBirthday.GetPersonBirthday(personKey); if (personBirthday is null) continue; peopleKeyValuePairs.Add(personKey, new(displayDirectoryName, approximateYears, personKey, new PersonBirthday[] { personBirthday })); } } } return result; } }