export const SCHEDULE_KEYS = ['*/30 * * * *', '0 * * * *', '0 0 * * *', '0 6 * * *'] as const;

const MINUTE = 60_000;
const HALF_HOUR = 30 * MINUTE;
const HOUR = 60 * MINUTE;
const DAY = 24 * HOUR;
const SIX_AM = 6 * HOUR;

function crossedBoundary(
  prevTickMs: number,
  nowMs: number,
  cadenceMs: number,
  offsetMs = 0,
): boolean {
  return Math.floor((nowMs - offsetMs) / cadenceMs) * cadenceMs + offsetMs > prevTickMs;
}

export function dueKeys(prevTickMs: number, nowMs: number): string[] {
  if (prevTickMs >= nowMs) return [];

  return SCHEDULE_KEYS.filter((key) => {
    switch (key) {
      case '*/30 * * * *':
        return crossedBoundary(prevTickMs, nowMs, HALF_HOUR);
      case '0 * * * *':
        return crossedBoundary(prevTickMs, nowMs, HOUR);
      case '0 0 * * *':
        return crossedBoundary(prevTickMs, nowMs, DAY);
      case '0 6 * * *':
        return crossedBoundary(prevTickMs, nowMs, DAY, SIX_AM);
    }
  });
}

export function nextTickMs(nowMs: number): number {
  return (Math.floor(nowMs / HALF_HOUR) + 1) * HALF_HOUR;
}
