import {
    getLocalTimeZone,
    parseDate,
    parseTime,
    toCalendarDateTime,
    fromDate,
    now,
    today
} from '@internationalized/date';

const localTimeZone = getLocalTimeZone();

/**
 * Convierte fecha local (string input YYYY-MM-DD) + hora (HH:MM) a UTC ISO string.
 * Útil para enviar datos al backend que espera timestamps absolutos.
 */
export function prepareDateForBackend(dateStr: string, timeStr: string = '00:00'): string | null {
    if (!dateStr) return null;
    try {
        const date = parseDate(dateStr);
        const time = parseTime(timeStr);
        // Combinar fecha y hora usando la zona horaria local
        const dateTime = toCalendarDateTime(date, time);
        const zonedDateTime = dateTime.toDate(localTimeZone);
        // Convertir a objeto Date nativo de JavaScript para obtener ISO string correcto
        const jsDate = new Date(zonedDateTime.toString());
        return jsDate.toISOString();
    } catch (e) {
        console.error('Error parsing date:', e);
        return null;
    }
}

/**
 * Convertir fechas que vienen del servidor (ISO UTC) a fecha local del calendario (YYYY-MM-DD string).
 * Útil para poblar inputs type="date".
 */
export function loadServerDate(isoStr: string | null | undefined): string {
    if (!isoStr) return '';
    try {
        // Si incluye T es ISO completo, convertir a zona local
        if (isoStr.includes('T')) {
            const dateObj = new Date(isoStr);
            const zonedDate = fromDate(dateObj, localTimeZone);
            return `${zonedDate.year}-${String(zonedDate.month).padStart(2, '0')}-${String(zonedDate.day).padStart(2, '0')}`;
        }
        // Si no, asumir fecha plana YYYY-MM-DD
        return isoStr.substring(0, 10);
    } catch {
        return isoStr || '';
    }
}

/**
 * Sumar días de forma segura con calendario y devolver string YYYY-MM-DD.
 */
export function addDaysLocal(dateStr: string, days: number): string {
    if (!dateStr) return '';
    try {
        return parseDate(dateStr).add({ days }).toString();
    } catch {
        return '';
    }
}

export function getCurrentLocalYear(): string {
    const nowZoned = now(localTimeZone);
    return String(nowZoned.year).slice(-2);
}

export function getCurrentLocalDate(): string {
    return today(localTimeZone).toString();
}

export function getCurrentLocalTime(): string {
    const nowZoned = now(localTimeZone);
    return `${String(nowZoned.hour).padStart(2, '0')}:${String(nowZoned.minute).padStart(2, '0')}`;
}
