50 lines
1.5 KiB
TypeScript
50 lines
1.5 KiB
TypeScript
// TODO: Move this business logic to core domain layer - scoring presets and their timing rules are domain concepts
|
|
|
|
type Timings = {
|
|
practiceMinutes?: number;
|
|
qualifyingMinutes?: number;
|
|
sprintRaceMinutes?: number;
|
|
mainRaceMinutes?: number;
|
|
sessionCount?: number;
|
|
roundsPlanned?: number;
|
|
raceDayOfWeek?: number;
|
|
raceTimeUtc?: string;
|
|
};
|
|
|
|
export class ScoringPresetApplier {
|
|
static applyToTimings(patternId: string, currentTimings: Timings): Timings {
|
|
const lowerPresetId = patternId.toLowerCase();
|
|
let updatedTimings: Timings = { ...currentTimings };
|
|
|
|
if (lowerPresetId.includes('sprint') || lowerPresetId.includes('double')) {
|
|
updatedTimings = {
|
|
...updatedTimings,
|
|
practiceMinutes: 15,
|
|
qualifyingMinutes: 20,
|
|
sprintRaceMinutes: 20,
|
|
mainRaceMinutes: 35,
|
|
sessionCount: 2,
|
|
};
|
|
} else if (lowerPresetId.includes('endurance') || lowerPresetId.includes('long')) {
|
|
updatedTimings = {
|
|
...updatedTimings,
|
|
practiceMinutes: 30,
|
|
qualifyingMinutes: 30,
|
|
mainRaceMinutes: 90,
|
|
sessionCount: 1,
|
|
};
|
|
delete (updatedTimings as { sprintRaceMinutes?: number }).sprintRaceMinutes;
|
|
} else {
|
|
updatedTimings = {
|
|
...updatedTimings,
|
|
practiceMinutes: 20,
|
|
qualifyingMinutes: 30,
|
|
mainRaceMinutes: 40,
|
|
sessionCount: 1,
|
|
};
|
|
delete (updatedTimings as { sprintRaceMinutes?: number }).sprintRaceMinutes;
|
|
}
|
|
|
|
return updatedTimings;
|
|
}
|
|
} |