import { isWerktag, previousWerktag } from './werktag.js'; /** * Zählt aufeinanderfolgende Werktage (Mo-Fr, ohne Feiertage) mit voller * Reflexion, rückwärts ab `today`. * * Regeln: * - Nur Tage in `fullDates` (status = 'full') zählen. * - Tage in `absenceDates` (Urlaub/Krank/…) sind neutral: überspringen, nicht * zählen, nicht brechen. * - Wochenenden und Feiertage sind keine Werktage → übersprungen. * - Heute ist Schonfrist: ist heute noch nicht voll, wird ab dem vorherigen * Werktag gezählt (die laufende Streak bleibt über den Tag erhalten). * - Bricht beim ersten Werktag, der weder voll noch Abwesenheit ist. */ export function countStreakDays(opts: { today: string; fullDates: Set; absenceDates: Set; }): number { const { today, fullDates, absenceDates } = opts; let cursor = today; let streak = 0; // Heute noch nicht reflektiert → ab vorherigem Werktag zählen. if (!fullDates.has(cursor)) cursor = previousWerktag(today); while (true) { // Nicht-Werktag (z. B. an einem Wochenende/Feiertag reflektiert) überspringen, // statt die Streak fälschlich abzubrechen. if (!isWerktag(cursor)) { cursor = previousWerktag(cursor); continue; } if (absenceDates.has(cursor)) { cursor = previousWerktag(cursor); continue; } if (fullDates.has(cursor)) { streak++; cursor = previousWerktag(cursor); continue; } break; } return streak; }