using System.Text; namespace View_by_Distance.Shared.Models.Stateless.Methods; internal abstract class Id { internal static bool NameWithoutExtensionIsIdFormat(Properties.IPropertyConfiguration propertyConfiguration, string fileNameWithoutExtension) { bool result; if (fileNameWithoutExtension.Length < 5 || fileNameWithoutExtension.Length > propertyConfiguration.IntMinValueLength) result = false; else { bool skipOneAllAreNumbers = fileNameWithoutExtension[1..].All(char.IsNumber); result = (skipOneAllAreNumbers && fileNameWithoutExtension[0] == '-') || (skipOneAllAreNumbers && char.IsNumber(fileNameWithoutExtension[0])); } return result; } internal static int GetId(Properties.IPropertyConfiguration propertyConfiguration, string intelligentId) { int result; StringBuilder results = new(); if (propertyConfiguration.IntMinValueLength < (propertyConfiguration.ResultAllInOneSubdirectoryLength + 2)) throw new NotSupportedException(); for (int i = intelligentId.Length - (propertyConfiguration.ResultAllInOneSubdirectoryLength + 2); i > -1; i--) _ = results.Append(intelligentId[i]); _ = results.Append(intelligentId[^3]).Append(intelligentId[^2]); result = int.Parse(results.ToString()); if (intelligentId[^1] is '1' or '2') result *= -1; else if (intelligentId[^1] is not '9' and not '8') throw new NotSupportedException(); return result; } internal static string GetIntelligentId(Properties.IPropertyConfiguration propertyConfiguration, long id, bool ignore) { string result; StringBuilder stringBuilder = new(); if (propertyConfiguration.IntMinValueLength < (propertyConfiguration.ResultAllInOneSubdirectoryLength + 2)) throw new NotSupportedException(); int key; string value; List resultAllInOneSubdirectoryChars = []; if (id > -1) { key = ignore ? 8 : 9; value = id.ToString().PadLeft(propertyConfiguration.IntMinValueLength, '0'); } else { key = ignore ? 2 : 1; value = id.ToString()[1..].PadLeft(propertyConfiguration.IntMinValueLength, '0'); } for (int i = value.Length - propertyConfiguration.ResultAllInOneSubdirectoryLength - 1; i > -1; i--) _ = stringBuilder.Append(value[i]); for (int i = value.Length - propertyConfiguration.ResultAllInOneSubdirectoryLength; i < value.Length; i++) resultAllInOneSubdirectoryChars.Add(value[i]); result = $"{stringBuilder}{string.Join(string.Empty, resultAllInOneSubdirectoryChars)}{key}"; return result; } internal static string GetPaddedId(Properties.IPropertyConfiguration propertyConfiguration, int index, int id) { string result; string intelligentId = GetIntelligentId(propertyConfiguration, id, ignore: false); int check = GetId(propertyConfiguration, intelligentId); if (check != id) throw new NotSupportedException(); result = $"{propertyConfiguration.Offset + index}{intelligentId}"; return result; } internal static int GetDeterministicHashCode(byte[] value) { int result; unchecked { int hash1 = (5381 << 16) + 5381; int hash2 = hash1; for (int i = 0; i < value.Length; i += 2) { hash1 = ((hash1 << 5) + hash1) ^ value[i]; if (i == value.Length - 1) break; hash2 = ((hash2 << 5) + hash2) ^ value[i + 1]; } result = hash1 + (hash2 * 1566083941); } return result; } }