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?, PersonBirthday[], long)> peopleCollection) { long ticks; string json; string[] segments; int? approximateYears; string groupDirectoryName; string personKeyFormatted; PersonBirthday[] collection; string personKeyJsonFileName; List personKeys = new(); string[] personKeyDirectories; string personKeyJsonDirectory; PersonBirthday? personBirthday; string[] personDisplayDirectories; string convertedPersonKeyDirectory; string? personDisplayDirectoryName; List personBirthdays; Dictionary personKeyValuePairs = new(); foreach (Person person in people) { personKeyFormatted = Shared.Models.Stateless.Methods.IPersonBirthday.GetFormatted(person.Birthday); if (personKeyValuePairs.ContainsKey(personKeyFormatted)) break; personKeyValuePairs.Add(personKeyFormatted, 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) { personKeyFormatted = Path.GetFileName(personKeyDirectory); if (!DateTime.TryParseExact(personKeyFormatted, "MM.dd.yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime birthday)) personBirthday = Shared.Models.Stateless.Methods.IPersonBirthday.GetPersonBirthday(personKeyFormatted); else { personBirthday = new PersonBirthday(birthday); personKeyFormatted = Shared.Models.Stateless.Methods.IPersonBirthday.GetFormatted(personBirthday); convertedPersonKeyDirectory = Path.Combine(personDisplayDirectory, personKeyFormatted); if (!Directory.Exists(convertedPersonKeyDirectory)) Directory.Move(personKeyDirectory, convertedPersonKeyDirectory); } if (personBirthday is null) continue; personBirthdays.Add(personBirthday); } if (!personBirthdays.Any()) continue; foreach (string personKeyDirectory in personKeyDirectories) { personKeyFormatted = Path.GetFileName(personKeyDirectory); personBirthday = Shared.Models.Stateless.Methods.IPersonBirthday.GetPersonBirthday(personKeyFormatted); if (personBirthday is null) continue; if (personKeyValuePairs.ContainsKey(personKeyFormatted)) { personKeyJsonDirectory = Path.Combine(personDisplayDirectory, personKeyFormatted); if (!Directory.Exists(personKeyJsonDirectory)) Directory.Move(personKeyDirectory, personKeyJsonDirectory); personKeyJsonFileName = Path.Combine(personKeyJsonDirectory, $"{personKeyFormatted}.json"); json = JsonSerializer.Serialize(personKeyValuePairs[personKeyFormatted], new JsonSerializerOptions() { WriteIndented = true }); _ = Shared.Models.Stateless.Methods.IPath.WriteAllText(personKeyJsonFileName, json, updateDateWhenMatches: false, compareBeforeWrite: true, updateToWhenMatches: null); } collection = personBirthdays.OrderByDescending(l => l.Value).ToArray(); ticks = collection[0].Value.Ticks; peopleCollection.Add(new(personDisplayDirectoryName, approximateYears, collection, ticks)); for (int i = 0; i < collection.Length; i++) { ticks = collection[i].Value.Ticks; personKeys.Add(ticks); } } } } 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++) { ticks = incrementDate.Ticks; personBirthday = new(incrementDate); incrementDate = incrementDate.AddDays(1); personKeyFormatted = Shared.Models.Stateless.Methods.IPersonBirthday.GetFormatted(personBirthday); if (personKeys.Contains(ticks)) continue; personKeys.Add(ticks); peopleCollection.Add(new(displayDirectoryName, approximateYears, new PersonBirthday[] { personBirthday }, ticks)); } } internal static void SetKeyValuePairs(string zPropertyHolderContentDirectory, List<(PersonBirthday, double)> deterministicHashCodeCollection, List<(PersonBirthday, double)> incorrectDeterministicHashCodeCollection, Dictionary> keyValuePairs) { string[] files; string personKey; string[] yearDirectories; string ticksDirectoryName; string? personFirstInitial; string[] personKeyDirectories; string[] personNameDirectories; PersonBirthday? personBirthday; string[] personNameLinkDirectories; string? personFirstInitialDirectory; double? reversedDeterministicHashCodeKey; bool keyValuePairsAny = keyValuePairs.Any(); string[] ticksDirectories = Directory.GetDirectories(zPropertyHolderContentDirectory, "*", 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.Length != Shared.Models.Stateless.IPersonBirthday.Format.Length) personBirthday = null; else { personBirthday = Shared.Models.Stateless.Methods.IPersonBirthday.GetPersonBirthday(personKey); if (personBirthday is null) continue; } 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); if (personKey == nameof(Closest) && files.Any()) throw new Exception($"Move personKey directories up one from {nameof(Closest)} and delete {nameof(Closest)} directory!"); if (personBirthday is null) continue; 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(personBirthday, 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); _ = Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(ticksDirectory); } } private static List GetTicks(Dictionary deterministicHashCodeUnknownFaceKeyValuePairs) { List results = new(); long personKey; foreach (KeyValuePair keyValuePair in deterministicHashCodeUnknownFaceKeyValuePairs) { foreach (PersonBirthday personBirthday in keyValuePair.Value) { personKey = personBirthday.Value.Ticks; results.Add(personKey); } } results = results.Distinct().ToList(); return results; } private static void Set(List<(PersonBirthday PersonBirthday, double IdAndNormalizedPixelPercentage)> deterministicHashCodeCollection, List deterministicHashCodePersonKeys, Dictionary> deterministicHashCodeScope) { long personKey; deterministicHashCodeCollection = (from l in deterministicHashCodeCollection orderby l.IdAndNormalizedPixelPercentage select l).ToList(); foreach ((PersonBirthday personBirthday, double idAndNormalizedPixelPercentage) in deterministicHashCodeCollection) { if (!deterministicHashCodeScope.ContainsKey(idAndNormalizedPixelPercentage)) deterministicHashCodeScope.Add(idAndNormalizedPixelPercentage, new()); deterministicHashCodeScope[idAndNormalizedPixelPercentage].Add(personBirthday); personKey = personBirthday.Value.Ticks; deterministicHashCodePersonKeys.Add(personKey); } } internal static void SetByRef(string resizeFilenameExtension, Person[] people, List skipCollection, Dictionary peopleKeyValuePairs, List notMappedTicks, Dictionary deterministicHashCodeUnknownFaceKeyValuePairs, Dictionary deterministicHashCodeKeyValuePairs, Dictionary incorrectDeterministicHashCodeKeyValuePairs, string zPropertyHolderContentDirectory, string zPropertyHolderPeopleContentDirectory) { Dictionary> keyValuePairs = new(); List deterministicHashCodePersonKeys = new(); List<(string, int?, PersonBirthday[], long)> peopleCollection = new(); Dictionary> deterministicHashCodeScope = new(); Dictionary> incorrectDeterministicHashCodeScope = new(); List deterministicHashCodeUnknownFacePersonKeys = GetTicks(deterministicHashCodeUnknownFaceKeyValuePairs); List<(PersonBirthday PersonBirthday, double IdAndNormalizedPixelPercentage)> incorrectDeterministicHashCodeCollection = new(); List<(PersonBirthday PersonBirthday, double IdAndNormalizedPixelPercentage)> deterministicHashCodeCollection = new(); SetOther(resizeFilenameExtension, people, zPropertyHolderPeopleContentDirectory, skipCollection, peopleCollection); SetKeyValuePairs(zPropertyHolderContentDirectory, deterministicHashCodeCollection, incorrectDeterministicHashCodeCollection, keyValuePairs); Set(deterministicHashCodeCollection, deterministicHashCodePersonKeys, deterministicHashCodeScope); incorrectDeterministicHashCodeCollection = (from l in incorrectDeterministicHashCodeCollection orderby l.IdAndNormalizedPixelPercentage select l).ToList(); deterministicHashCodePersonKeys = deterministicHashCodePersonKeys.Distinct().ToList(); foreach ((PersonBirthday personBirthday, double idAndNormalizedPixelPercentage) in incorrectDeterministicHashCodeCollection) { if (!incorrectDeterministicHashCodeScope.ContainsKey(idAndNormalizedPixelPercentage)) incorrectDeterministicHashCodeScope.Add(idAndNormalizedPixelPercentage, new()); incorrectDeterministicHashCodeScope[idAndNormalizedPixelPercentage].Add(personBirthday); } foreach (KeyValuePair> keyValuePair in deterministicHashCodeScope) deterministicHashCodeKeyValuePairs.Add(keyValuePair.Key, keyValuePair.Value.Distinct().ToArray()); foreach (KeyValuePair> keyValuePair in incorrectDeterministicHashCodeScope) incorrectDeterministicHashCodeKeyValuePairs.Add(keyValuePair.Key, keyValuePair.Value.Distinct().ToArray()); if (peopleCollection.Any()) { foreach ((string displayDirectoryName, int? approximateYears, PersonBirthday[] personBirthdays, long ticks) in peopleCollection) { if (peopleKeyValuePairs.ContainsKey(ticks) && peopleKeyValuePairs[ticks].Item1 != displayDirectoryName) throw new NotImplementedException(); if (deterministicHashCodeUnknownFacePersonKeys.Contains(ticks) || deterministicHashCodePersonKeys.Contains(ticks)) peopleKeyValuePairs.Add(ticks, new(displayDirectoryName, approximateYears, personBirthdays, ticks)); else notMappedTicks.Add(ticks); } } if (deterministicHashCodeUnknownFacePersonKeys.Any() || deterministicHashCodePersonKeys.Any()) { int? approximateYears = null; PersonBirthday? personBirthday; const string displayDirectoryName = Property.Models.Stateless.IResult.AllInOne; foreach (long personKey in deterministicHashCodeUnknownFacePersonKeys) { if (!peopleKeyValuePairs.ContainsKey(personKey)) { personBirthday = Shared.Models.Stateless.Methods.IPersonBirthday.GetPersonBirthday(personKey); peopleKeyValuePairs.Add(personKey, new(displayDirectoryName, approximateYears, new PersonBirthday[] { personBirthday }, personKey)); } } foreach (long personKey in deterministicHashCodePersonKeys) { if (!peopleKeyValuePairs.ContainsKey(personKey)) { personBirthday = Shared.Models.Stateless.Methods.IPersonBirthday.GetPersonBirthday(personKey); peopleKeyValuePairs.Add(personKey, new(displayDirectoryName, approximateYears, new PersonBirthday[] { personBirthday }, personKey)); } } } } }