namespace View_by_Distance.Shared.Models.Stateless.Methods; internal abstract class Closest { private static int Get(double rawAverage) => (int)(Math.Round(rawAverage, Stateless.IClosest.Digits) * Stateless.ILocation.Factor); private static Models.Closest Get(Models.Face face, DateTime minimumDateTime, FaceDistance faceDistance) { Models.Closest result; long? ticksDelta; double minimum = faceDistance.Distances.Min(); double rawAverage = faceDistance.Distances.Average(); bool aboveTolerance = minimum >= Stateless.IClosest.Tolerance || rawAverage >= Stateless.IClosest.Tolerance; if (faceDistance.IsWrongYear is null || faceDistance.IsWrongYear.Value) ticksDelta = null; else { ticksDelta = Math.Abs(faceDistance.MinimumDateTime.Ticks - minimumDateTime.Ticks); if (faceDistance.MinimumDateTime < faceDistance.Mapping.PersonBirthday.Value) ticksDelta *= 2; else if (faceDistance.Mapping.ApproximateYears.HasValue && faceDistance.MinimumDateTime < DateTime.Now.AddYears(-faceDistance.Mapping.ApproximateYears.Value)) ticksDelta *= 2; } if (face.Location?.NormalizedPixelPercentage is null) throw new NullReferenceException(nameof(face.Location.NormalizedPixelPercentage)); int average = Get(rawAverage); result = new(aboveTolerance, average, face.Location.NormalizedPixelPercentage.Value, faceDistance.IsWrongYear, faceDistance.Mapping, minimum, faceDistance.MinimumDateTime, ticksDelta); return result; } internal static Models.Closest[] GetCollection(Models.Face face, DateTime minimumDateTime, List faceDistances) { Models.Closest[] results; Models.Closest[] closestCollection = (from l in faceDistances select Get(face, minimumDateTime, l)).ToArray(); results = (from l in closestCollection orderby l.Average, l.TicksDelta.HasValue, l.TicksDelta select l).ToArray(); return results; } }