43 lines
1.9 KiB
C#
43 lines
1.9 KiB
C#
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<DashboardSystemPerformance> 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;
|
|
}
|