/**
 * 时间日期格式化工具
 * 支持多种格式化方式和格式字符串
 */

/**
 * 格式化日期时间（使用 Intl API，推荐使用）
 * @param date 可以是时间戳（毫秒）、Date 对象、字符串格式的日期
 * @param format 格式化类型：'date' | 'datetime' | 'time' | 'full'
 * @returns 格式化后的日期字符串
 */
export function formatDate(
  date?: number | string | Date | null,
  format: 'date' | 'datetime' | 'time' | 'full' = 'datetime'
): string {
  if (!date) return '-';

  let dateObj: Date;

  // 处理时间戳（毫秒）
  if (typeof date === 'number') {
    // 判断是秒级还是毫秒级时间戳
    // 如果小于 13 位数字，认为是秒级，需要乘以 1000
    if (date.toString().length <= 10) {
      dateObj = new Date(date * 1000);
    } else {
      dateObj = new Date(date);
    }
  } else if (typeof date === 'string') {
    const trimmedDate = date.trim();
    if (/^\d+$/.test(trimmedDate)) {
      const timestamp = Number(trimmedDate);
      dateObj = new Date(trimmedDate.length <= 10 ? timestamp * 1000 : timestamp);
    } else {
      dateObj = new Date(date);
    }
  } else {
    dateObj = date;
  }

  // 检查日期是否有效
  if (isNaN(dateObj.getTime())) {
    return '-';
  }

  const options: Intl.DateTimeFormatOptions = {};

  switch (format) {
    case 'date':
      options.year = 'numeric';
      options.month = '2-digit';
      options.day = '2-digit';
      break;
    case 'time':
      options.hour = '2-digit';
      options.minute = '2-digit';
      options.second = '2-digit';
      break;
    case 'full':
      options.year = 'numeric';
      options.month = '2-digit';
      options.day = '2-digit';
      options.hour = '2-digit';
      options.minute = '2-digit';
      options.second = '2-digit';
      break;
    case 'datetime':
    default:
      options.year = 'numeric';
      options.month = '2-digit';
      options.day = '2-digit';
      options.hour = '2-digit';
      options.minute = '2-digit';
      break;
  }

  return dateObj.toLocaleString('zh-CN', options);
}

/**
 * 格式化日期（仅日期部分）
 */
export function formatDateOnly(date?: number | string | Date | null): string {
  return formatDate(date, 'date');
}

/**
 * 格式化时间（仅时间部分）
 */
export function formatTimeOnly(date?: number | string | Date | null): string {
  return formatDate(date, 'time');
}

/**
 * 格式化完整日期时间（包含秒）
 */
export function formatDateTimeFull(date?: number | string | Date | null): string {
  return formatDate(date, 'full');
}

/**
 * 时间日期转换（使用格式字符串，兼容旧代码）
 * @param date 当前时间，Date 格式或字符串
 * @param formatStr 需要转换的时间格式字符串，默认为 'YYYY-MM-DD HH:mm:ss'
 * @returns 返回拼接后的时间字符串
 */
export function formatDateWithFormat(
  date: Date | string | number | null | undefined,
  formatStr: string = 'YYYY-MM-DD HH:mm:ss'
): string {
  // 日期不存在，则返回空
  if (!date && date !== 0) {
    return '';
  }

  let d: Date;
  
  // 处理不同类型的输入
  if (date instanceof Date) {
    d = date;
  } else if (typeof date === 'number') {
    // 如果是数字，可能是时间戳（秒或毫秒）
    d = new Date(date > 1000000000000 ? date : date * 1000);
  } else if (typeof date === 'string') {
    const trimmedDate = date.trim();
    if (/^\d+$/.test(trimmedDate)) {
      const timestamp = Number(trimmedDate);
      d = new Date(trimmedDate.length <= 10 ? timestamp * 1000 : timestamp);
    } else {
      d = new Date(date);
    }
  } else {
    return '';
  }

  // 检查日期是否有效
  if (!(d instanceof Date) || isNaN(d.getTime())) {
    return '';
  }

  const year = d.getFullYear();
  const month = String(d.getMonth() + 1).padStart(2, '0');
  const day = String(d.getDate()).padStart(2, '0');
  const hours = String(d.getHours()).padStart(2, '0');
  const minutes = String(d.getMinutes()).padStart(2, '0');
  const seconds = String(d.getSeconds()).padStart(2, '0');

  return formatStr
    .replace('YYYY', String(year))
    .replace('MM', month)
    .replace('DD', day)
    .replace('HH', hours)
    .replace('mm', minutes)
    .replace('ss', seconds);
}

/**
 * element plus 的时间 Formatter 实现，使用 YYYY-MM-DD HH:mm:ss 格式
 * @param cellValue 字段值
 */
export function dateFormatter(cellValue: any): string {
  return cellValue ? formatDateWithFormat(cellValue) : '';
}

/**
 * element plus 的时间 Formatter 实现，使用 YYYY-MM-DD 格式
 * @param cellValue 字段值
 */
export function dateFormatter2(cellValue: any): string {
  return cellValue ? formatDateWithFormat(cellValue, 'YYYY-MM-DD') : '';
}
