namespace View_by_Distance.Shared.Models.Stateless.Methods; internal abstract class PersonContainer { private static List GetPersonContainersCollections(string personBirthdayFormat, char[] chars, string personDisplayDirectory, string personDisplayDirectoryName, string[] personKeyDirectories, int? approximateYears, List collections) { List results = new(); long personKey; string[] segments; const int zero = 0; Models.Person person; string personKeyFormatted; Models.PersonBirthday? personBirthday; Models.PersonContainer personContainer; Models.PersonBirthday[] personBirthdays = collections.OrderByDescending(l => l.Value).ToArray(); string[] personDisplayDirectoryAllFiles = Directory.GetFiles(personDisplayDirectory, "*", SearchOption.AllDirectories); foreach (string personKeyDirectory in personKeyDirectories) { personKeyFormatted = Path.GetFileName(personKeyDirectory); personBirthday = IPersonBirthday.GetPersonBirthday(personBirthdayFormat, personKeyFormatted); if (personBirthday is null) continue; personKey = personBirthdays[zero].Value.Ticks; segments = personDisplayDirectoryName.Split(chars); person = IPerson.GetPerson(personKey, segments); personContainer = new(approximateYears, person, personBirthdays, personDisplayDirectoryAllFiles, personDisplayDirectoryName, personKey); results.Add(personContainer); } return results; } private static Models.PersonContainer GetPersonContainer(string personDisplayDirectory, string personDisplayDirectoryName, int? approximateYears) { Models.PersonContainer result; string[] personDisplayDirectoryAllFiles = Directory.GetFiles(personDisplayDirectory, "*", SearchOption.AllDirectories); result = new(approximateYears, personDisplayDirectoryAllFiles, personDisplayDirectoryName); return result; } private static List GetPersonContainersGroup(string personBirthdayFormat, char[] chars, string[] personDisplayDirectories) { List results = new(); int? approximateYears; string[] personKeyDirectories; string? personDisplayDirectoryName; List collections; foreach (string personDisplayDirectory in personDisplayDirectories) { personDisplayDirectoryName = Path.GetFileName(personDisplayDirectory); if (string.IsNullOrEmpty(personDisplayDirectoryName)) continue; approximateYears = Age.GetApproximateYears(personDisplayDirectoryName, chars); personKeyDirectories = Directory.GetDirectories(personDisplayDirectory, "*", SearchOption.TopDirectoryOnly); collections = PersonBirthday.GetPersonBirthdays(personBirthdayFormat, personKeyDirectories, personDisplayDirectory); if (!collections.Any()) results.Add(GetPersonContainer(personDisplayDirectory, personDisplayDirectoryName, approximateYears)); else results.AddRange(GetPersonContainersCollections(personBirthdayFormat, chars, personDisplayDirectory, personDisplayDirectoryName, personKeyDirectories, approximateYears, collections)); } return results; } private static List GetPersonContainersGroups(string personBirthdayFormat, char[] chars, string[] groupDirectories) { List results = new(); const int zero = 0; string groupDirectoryName; string[] personDisplayDirectories; List personContainers; foreach (string groupDirectory in groupDirectories) { groupDirectoryName = Path.GetFileName(groupDirectory); if (!chars.Contains(groupDirectoryName[zero])) continue; personDisplayDirectories = Directory.GetDirectories(groupDirectory, "*", SearchOption.TopDirectoryOnly); personContainers = GetPersonContainersGroup(personBirthdayFormat, chars, personDisplayDirectories); results.AddRange(personContainers); } return results; } internal static List GetPersonContainers(Properties.IStorage storage, string personBirthdayFormat) { List results; char[] chars = IAge.GetChars(); string a2PeopleSingletonDirectory = Path.Combine(storage.PeopleRootDirectory, "{}"); if (!Directory.Exists(a2PeopleSingletonDirectory)) _ = Directory.CreateDirectory(a2PeopleSingletonDirectory); string a2PeopleSingletonDirectoryChar; foreach (char @char in chars) { a2PeopleSingletonDirectoryChar = Path.Combine(a2PeopleSingletonDirectory, @char.ToString()); if (!Directory.Exists(a2PeopleSingletonDirectoryChar)) _ = Directory.CreateDirectory(a2PeopleSingletonDirectoryChar); } string[] groupDirectories = Directory.GetDirectories(a2PeopleSingletonDirectory, "*", SearchOption.TopDirectoryOnly); if (!groupDirectories.Any()) results = new(); else results = GetPersonContainersGroups(personBirthdayFormat, chars, groupDirectories); return results; } }