57 lines
1.6 KiB
TypeScript
57 lines
1.6 KiB
TypeScript
export type ScoringPresetTimings = {
|
|
practiceMinutes?: number;
|
|
qualifyingMinutes?: number;
|
|
sprintRaceMinutes?: number;
|
|
mainRaceMinutes?: number;
|
|
sessionCount?: number;
|
|
roundsPlanned?: number;
|
|
raceDayOfWeek?: number;
|
|
raceTimeUtc?: string;
|
|
};
|
|
|
|
/**
|
|
* Apply high-level scoring preset semantics to league/session timings.
|
|
*
|
|
* This encapsulates the mapping between logical scoring presets (sprint, endurance, etc.)
|
|
* and their default timing configuration so that UI layers do not need to duplicate
|
|
* or interpret preset IDs directly.
|
|
*/
|
|
export function applyScoringPresetToTimings(
|
|
patternId: string,
|
|
currentTimings: ScoringPresetTimings,
|
|
): ScoringPresetTimings {
|
|
const lowerPresetId = patternId.toLowerCase();
|
|
let updatedTimings: ScoringPresetTimings = { ...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;
|
|
}
|