import dayjs from 'dayjs';

/**
 * 计算两个日期之间经过的时间，如 "3分12秒"
 *
 * @param {string | null | undefined} begin - The starting date.
 * @param {string | null | undefined} end - The ending date.
 * @return {string} The formatted elapsed time string.
 */
export const elapsedTime = (begin?: string | Date | null, end?: string | Date | null): string => {
  if (begin === undefined || begin === null) {
    return '--';
  }

  if (end === undefined || end === null) {
    return '--';
  }

  const beginDate = dayjs(begin);
  const endDate = dayjs(end); // end === undefined || end === null ? dayjs(now()) : dayjs(end);
  if (!beginDate.isValid() || !endDate.isValid()) {
    return '--';
  }

  const timestamp = endDate.valueOf() - beginDate.valueOf();
  if (timestamp < 0) {
    return '0秒';
  }
  const duration = dayjs.duration(timestamp);
  const years = duration.years();
  const months = duration.months();
  const days = duration.days();
  const hours = duration.hours();
  const minutes = duration.minutes();
  const seconds = duration.seconds();
  const elspsedArray = [];
  if (years !== 0) {
    elspsedArray.push(`${years}年`);
  }
  if (months !== 0) {
    elspsedArray.push(`${months}个月`);
  }
  if (days !== 0) {
    elspsedArray.push(`${days}天`);
  }
  if (hours !== 0) {
    elspsedArray.push(`${hours}小时`);
  }
  if (minutes !== 0) {
    elspsedArray.push(`${minutes}分`);
  }
  if (seconds !== 0) {
    elspsedArray.push(`${seconds}秒`);
  }

  if (elspsedArray.length === 0) {
    return '0秒';
  }
  return elspsedArray.slice(0, 2).join('');
};

/**
 * 是否是有效的日期
 *
 * @param {Date} date - The date to check.
 * @return {boolean} True if the date is valid, false otherwise.
 */
export const isValidDate = (date: Date): boolean => {
  if (date instanceof Date) {
    return !Number.isNaN(date.getTime()); // valueOf() 也可以
  }
  return false;
};

/**
 * 能否使用 dayjs 转换成 Date
 *
 * @param {Date | string | number | null | undefined} date - The date to be checked.
 * @return {boolean} Returns true if the date can be converted to a valid Date object, otherwise returns false.
 */
export const canBeConvertToDate = (date?: Date | string | number | null): boolean => {
  if (date === undefined || date === null || date === '') {
    return false;
  }
  const convertedDate = dayjs(date);
  return convertedDate.isValid();
};

/**
 * 转换日期
 *
 * @param {Date | string | number | null | undefined} date - The date to format.
 * @param {string} [format='YYYY-MM-DD HH:mm:ss'] - The format string to use.
 * @return {string} The formatted date string.
 */
export const formatDate = (
  date: Date | string | number | null | undefined,
  format: string = 'YYYY-MM-DD HH:mm:ss',
): string => {
  if (date === undefined || date === null || date === '') {
    return '--';
  }
  const convertedDate = dayjs(date);
  if (!convertedDate.isValid()) {
    return '--';
  }

  return convertedDate.format(format);
};
