using QuestionsApi.Models; namespace QuestionsApi.Services; public static class ProgressionPolicy { public sealed record Threshold(int L, int P, int S, int M, int H, int R); public static readonly Threshold[] Thresholds = [ new(0,0,0,0,0,0), new(2,0,0,0,1,0), new(4,1,0,0,3,1), new(6,2,0,0,6,1), new(8,4,0,0,10,2), new(10,6,0,0,15,3), new(0,8,1,0,20,4), new(0,9,2,0,28,5), new(0,10,4,0,36,7), new(0,11,5,1,45,9), new(0,12,7,2,55,11), new(0,13,9,4,65,13), new(0,14,10,6,75,15), new(0,14,12,9,90,18), new(0,14,14,12,105,21) ]; public static readonly string[] Names = ["Case Scout", "Pattern Hunter", "Diagnostic Tactician", "Management Strategist", "Clinical Vanguard"]; public static readonly string[] Divisions = ["III", "II", "I"]; public static int Qualified(IReadOnlyCollection systems, int retention) { var l = systems.Count(x => State(x.MasteryState) >= 1); var p = systems.Count(x => State(x.MasteryState) >= 2); var s = systems.Count(x => State(x.MasteryState) >= 3); var m = systems.Count(x => State(x.MasteryState) >= 4); var h = systems.Sum(x => x.Difficulty4PlusSuccessful); for (var i = Thresholds.Length - 1; i >= 0; i--) { var t = Thresholds[i]; if (l >= t.L && p >= t.P && s >= t.S && m >= t.M && h >= t.H && retention >= t.R) return i; } return 0; } public static int State(string state) => state switch { MasteryStates.Learning => 1, MasteryStates.Practicing => 2, MasteryStates.Strong => 3, MasteryStates.Mastered => 4, _ => 0 }; public static string Name(int ordinal) => Names[Math.Clamp(ordinal / 3, 0, 4)]; public static string Division(int ordinal) => Divisions[Math.Clamp(ordinal % 3, 0, 2)]; public static int TierStart(int ordinal) => ordinal / 3 * 3; }