export class DateRangeCalculator { static clearTime(date) { if (!date) return null; const d = new Date(date); d.setHours(0, 0, 0, 0); return d; } static datesEqual(left, right) { if (!left || !right) return false; return left.getFullYear() === right.getFullYear() && left.getMonth() === right.getMonth() && left.getDate() === right.getDate(); } static calculatePreset(presetName, todayInput = new Date()) { const today = this.clearTime(todayInput); let start = null; let end = null; switch (presetName) { case 'today': start = new Date(today); end = new Date(today); break; case 'yesterday': start = new Date(today); start.setDate(today.getDate() - 1); end = new Date(start); break; case 'last7': end = new Date(today); start = new Date(today); start.setDate(today.getDate() - 6); break; case 'last14': end = new Date(today); start = new Date(today); start.setDate(today.getDate() - 13); break; case 'last30': end = new Date(today); start = new Date(today); start.setDate(today.getDate() - 29); break; case 'thisWeek': { end = new Date(today); start = new Date(today); const day = today.getDay(); const diff = today.getDate() - day + (day === 0 ? -6 : 1); start.setDate(diff); break; } case 'lastWeek': { const temp = new Date(today); const day = temp.getDay(); const diff = temp.getDate() - day + (day === 0 ? -6 : 1); start = new Date(temp); start.setDate(diff - 7); end = new Date(temp); end.setDate(diff - 1); break; } case 'thisMonth': start = new Date(today.getFullYear(), today.getMonth(), 1); end = new Date(today); break; case 'lastMonth': start = new Date(today.getFullYear(), today.getMonth() - 1, 1); end = new Date(today.getFullYear(), today.getMonth(), 0); break; case 'all': default: start = null; end = null; break; } return { start, end }; } static formatDisplay(date) { if (!date) return ''; const d = new Date(date); const day = String(d.getDate()).padStart(2, '0'); const month = String(d.getMonth() + 1).padStart(2, '0'); return `${day}/${month}/${d.getFullYear()}`; } static parseDisplayDate(value) { const match = String(value || '').trim().match(/^(\d{1,2})[\/\-.](\d{1,2})[\/\-.](\d{4})$/); if (!match) return null; const day = Number.parseInt(match[1], 10); const month = Number.parseInt(match[2], 10) - 1; const year = Number.parseInt(match[3], 10); if (month < 0 || month > 11 || day < 1 || day > 31 || year < 1000 || year > 9999) return null; const date = new Date(year, month, day); if (date.getFullYear() !== year || date.getMonth() !== month || date.getDate() !== day) return null; return date; } static toDateKey(date) { if (!date) return ''; const d = new Date(date); const year = d.getFullYear(); const month = String(d.getMonth() + 1).padStart(2, '0'); const day = String(d.getDate()).padStart(2, '0'); return `${year}-${month}-${day}`; } }