export interface ScheduleVisibilityRange { startAt: Date | null endAt: Date | null } export interface VisibilitySettingsLike { scheduleDaysBeforeEnabled?: boolean | null scheduleDaysBefore?: number | null scheduleDaysAfterEnabled?: boolean | null scheduleDaysAfter?: number | null } export function resolveScheduleVisibilityRange( settings: VisibilitySettingsLike | null | undefined, referenceDate = new Date() ): ScheduleVisibilityRange { const today = new Date( referenceDate.getFullYear(), referenceDate.getMonth(), referenceDate.getDate() ) let startAt: Date | null = null let endAt: Date | null = null if (settings?.scheduleDaysBeforeEnabled) { const days = Math.max(0, Number(settings.scheduleDaysBefore) || 0) const d = new Date(today) d.setDate(d.getDate() - days) startAt = d } if (settings?.scheduleDaysAfterEnabled) { const days = Math.max(0, Number(settings.scheduleDaysAfter) || 0) const d = new Date(today) d.setDate(d.getDate() + days + 1) endAt = d } return { startAt, endAt } } export function isPlayDateInRange( playDate: Date | string | null | undefined, range: ScheduleVisibilityRange ): boolean { if (!playDate) return true const d = new Date(playDate) if (range.startAt && d.getTime() < range.startAt.getTime()) return false if (range.endAt && d.getTime() >= range.endAt.getTime()) return false return true }