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}`;
    }
}
