import { Medication, Dose, Frequency, CustomReminder, ReminderInstance, } from '../types'; export const generateSchedule = ( medications: Medication[], forDate: Date ): Dose[] => { const schedule: Dose[] = []; const today = new Date(forDate); today.setHours(0, 0, 0, 0); medications.forEach(med => { const [startHour, startMinute] = med.startTime.split(':').map(Number); const createDose = (hour: number, minute: number): Dose => { const scheduledTime = new Date(today); scheduledTime.setHours(hour, minute, 0, 0); const dateString = scheduledTime.toISOString().split('T')[0]; const timeString = scheduledTime .toTimeString() .split(' ')[0] .replace(/:/g, ''); return { id: `${med._id}-${dateString}-${timeString}`, medicationId: med._id, scheduledTime, }; }; switch (med.frequency) { case Frequency.Daily: schedule.push(createDose(startHour, startMinute)); break; case Frequency.TwiceADay: schedule.push(createDose(startHour, startMinute)); schedule.push(createDose((startHour + 12) % 24, startMinute)); break; case Frequency.ThreeTimesADay: schedule.push(createDose(startHour, startMinute)); schedule.push(createDose((startHour + 8) % 24, startMinute)); schedule.push(createDose((startHour + 16) % 24, startMinute)); break; case Frequency.EveryXHours: if (med.hoursBetween && med.hoursBetween > 0) { for (let h = 0; h < 24; h += med.hoursBetween) { schedule.push(createDose((startHour + h) % 24, startMinute)); } } break; } }); return schedule.sort( (a, b) => a.scheduledTime.getTime() - b.scheduledTime.getTime() ); }; export const generateReminderSchedule = ( reminders: CustomReminder[], forDate: Date ): ReminderInstance[] => { const schedule: ReminderInstance[] = []; const today = new Date(forDate); today.setHours(0, 0, 0, 0); reminders.forEach(reminder => { const [startHour, startMinute] = reminder.startTime.split(':').map(Number); const [endHour, endMinute] = reminder.endTime.split(':').map(Number); const firstReminderTime = new Date(today); firstReminderTime.setHours(startHour, startMinute, 0, 0); const endOfWindowTime = new Date(today); endOfWindowTime.setHours(endHour, endMinute, 0, 0); let currentReminderTime = firstReminderTime; while (currentReminderTime.getTime() <= endOfWindowTime.getTime()) { const dateString = currentReminderTime.toISOString().split('T')[0]; const timeString = currentReminderTime .toTimeString() .split(' ')[0] .replace(/:/g, ''); schedule.push({ id: `${reminder._id}-${dateString}-${timeString}`, reminderId: reminder._id, title: reminder.title, icon: reminder.icon, scheduledTime: new Date(currentReminderTime), }); currentReminderTime = new Date( currentReminderTime.getTime() + reminder.frequencyMinutes * 60000 ); } }); return schedule.sort( (a, b) => a.scheduledTime.getTime() - b.scheduledTime.getTime() ); };