/**
 * Checks if a given date is valid.
 *
 * @param {number|string|Date} date - The date to be checked.
 * @returns {boolean} True if the date is valid, false otherwise.
 *
 * @example
 * // returns true
 * isValidDate(new Date());
 *
 * @example
 * // returns false
 * isValidDate('invalid date');
 */
export function isValidDate(date) {
    return date && !isNaN(new Date(date).getTime());
}

/**
 * Converts a given date to a specific format.
 *
 * @param {number|string|Date} date - The date to be formatted.
 * @param {Object} opts - Optional parameters to customize the output format.
 * @returns {string} The formatted date as a string in 'dd/mm/yyyy' format. If the provided date is not valid, an empty string is returned.
 *
 * @example
 * // returns "02/12/2022"
 * toDateFormat(new Date(2022, 11, 2));
 */
export function toDateFormat(date, locale = 'es-ES', opts = {}) {
    if (!isValidDate(date)) return '';

    const format = Object.assign(
        { year: 'numeric', month: '2-digit', day: '2-digit' },
        opts
    );
    return new Date(date).toLocaleDateString(locale, format);
}

/**
 * Converts a given date to a specific time format.
 *
 * @param {number|string|Date} date - The date to be formatted.
 * @param {boolean} [showSeconds=false] - Whether to include seconds in the output format.
 * @returns {string} The formatted time as a string in 'hh:mm:ss' format. If the provided date is not valid, an empty string is returned. If showSeconds is false, seconds are not included in the output format.
 *
 * @example
 * // returns "00:00"
 * toTimeFormat(new Date(2022, 11, 2));
 *
 * @example
 * // returns "00:00:00"
 * toTimeFormat(new Date(2022, 11, 2), true);
 */
export function toTimeFormat(date, showSeconds = false) {
    if (!isValidDate(date)) {
        return '';
    }
    return new Date(date).toLocaleTimeString('es-ES', {
        hour: '2-digit',
        minute: '2-digit',
        second: showSeconds ? '2-digit' : undefined,
    });
}

/**
 * Converts a given date to a specific date and time format.
 *
 * @param {number|string|Date} date - The date to be formatted.
 * @param {boolean} [showSeconds=false] - Whether to include seconds in the output format.
 * @returns {string} The formatted date as a string in 'dd/mm/yyyy, hh:mm:ss' format. If the provided date is not valid, an empty string is returned. If showSeconds is false, seconds are not included in the output format.
 *
 * @example
 * // returns "02/12/2022, 00:00"
 * toDateTimeFormat(new Date(2022, 11, 2));
 *
 * @example
 * // returns "02/12/2022, 00:00:00"
 * toDateTimeFormat(new Date(2022, 11, 2), true);
 */
export function toDateTimeFormat(date, showSeconds = false) {
    if (!isValidDate(date)) {
        return '';
    }
    return new Date(date).toLocaleDateString('es-ES', {
        year: 'numeric',
        month: '2-digit',
        day: '2-digit',
        hour: '2-digit',
        minute: '2-digit',
        second: showSeconds ? '2-digit' : undefined,
    });
}

/**
 * Converts seconds to a formatted string representing hours and minutes (hh:mm).
 * @param {number} seconds - The number of seconds to convert.
 * @param {boolean} includeHSuffix - Optional parameter indicating whether to include "h." after the hour.
 * @returns {string} A string representing the time in the format "hh:mm" with optional "h." suffix.
 */
export function secondsToHoursMinutes(seconds, includeHSuffix = true) {
    if (!seconds) return includeHSuffix ? '00:00 h.' : '00:00';

    const hours = Math.floor(seconds / 3600);
    const remainingMinutes = seconds % 3600;
    const minutes = Math.floor(remainingMinutes / 60);
    const formattedHours = hours < 10 ? '0' + hours : hours;
    const formattedMinutes = minutes < 10 ? '0' + minutes : minutes;

    // Append "h." if includeHSuffix is true
    const suffix = includeHSuffix ? ' h.' : '';
    // Return formatted string
    return formattedHours + ':' + formattedMinutes + suffix;
}

export function getTimeDifferenceWithToday(date) {
    let today = Date.vnNew();
    today.setHours(0, 0, 0, 0);

    date = new Date(date);
    date.setHours(0, 0, 0, 0);

    return today - date;
}

export function isLower(date) {
    return getTimeDifferenceWithToday(date) > 0;
}

export function isBigger(date) {
    return getTimeDifferenceWithToday(date) < 0;
}
