import dayjs from 'dayjs'
import relativeTime from 'dayjs/plugin/relativeTime'
import utc from 'dayjs/plugin/utc'
import timezone from 'dayjs/plugin/timezone'
import 'dayjs/locale/zh-cn'

// 配置dayjs插件
dayjs.extend(relativeTime)
dayjs.extend(utc)
dayjs.extend(timezone)
dayjs.locale('zh-cn')

/**
 * 格式化日期
 * @param date 日期
 * @param format 格式化字符串，默认为 'YYYY-MM-DD HH:mm:ss'
 * @returns 格式化后的日期字符串
 */
export const formatDate = (date: string | Date | dayjs.Dayjs | null | undefined, format = 'YYYY-MM-DD HH:mm:ss'): string => {
  if (!date) return ''
  return dayjs(date).format(format)
}

/**
 * 格式化相对时间
 * @param date 日期
 * @returns 相对时间字符串，如 "2小时前"
 */
export const formatRelativeTime = (date: string | Date | dayjs.Dayjs | null | undefined): string => {
  if (!date) return ''
  return dayjs(date).fromNow()
}

/**
 * 格式化日期为友好显示
 * @param date 日期
 * @returns 友好的日期显示
 */
export const formatFriendlyDate = (date: string | Date | dayjs.Dayjs | null | undefined): string => {
  if (!date) return ''
  const now = dayjs()
  const target = dayjs(date)
  const diffDays = now.diff(target, 'day')
  
  if (diffDays === 0) {
    return target.format('HH:mm')
  } else if (diffDays === 1) {
    return `昨天 ${target.format('HH:mm')}`
  } else if (diffDays < 7) {
    return `${diffDays}天前`
  } else {
    return target.format('MM-DD HH:mm')
  }
}

/**
 * 格式化为日期（不包含时间）
 * @param date 日期字符串或Date对象
 * @returns 格式化后的日期字符串，如"2024-01-15"
 */
export const formatDateOnly = (date: string | Date | null | undefined): string => {
  return formatDate(date, 'YYYY-MM-DD')
}

/**
 * 格式化为时间（不包含日期）
 * @param date 日期字符串或Date对象
 * @returns 格式化后的时间字符串，如"14:30:25"
 */
export const formatTimeOnly = (date: string | Date | null | undefined): string => {
  return formatDate(date, 'HH:mm:ss')
}

/**
 * 格式化为中文日期时间
 * @param date 日期字符串或Date对象
 * @returns 中文格式的日期时间字符串，如"2024年1月15日 14:30"
 */
export const formatChineseDateTime = (date: string | Date | null | undefined): string => {
  return formatDate(date, 'YYYY年M月D日 HH:mm')
}

/**
 * 判断是否为今天
 * @param date 日期
 * @returns 是否为今天
 */
export const isToday = (date: string | Date | dayjs.Dayjs | null | undefined): boolean => {
  if (!date) return false
  return dayjs(date).isSame(dayjs(), 'day')
}

/**
 * 判断是否为本周
 * @param date 日期
 * @returns 是否为本周
 */
export const isThisWeek = (date: string | Date | dayjs.Dayjs | null | undefined): boolean => {
  if (!date) return false
  return dayjs(date).isSame(dayjs(), 'week')
}

/**
 * 判断是否为本月
 * @param date 日期
 * @returns 是否为本月
 */
export const isThisMonth = (date: string | Date | dayjs.Dayjs | null | undefined): boolean => {
  if (!date) return false
  return dayjs(date).isSame(dayjs(), 'month')
}

/**
 * 获取时间范围
 * @param type 时间范围类型
 * @returns 时间范围数组 [开始时间, 结束时间]
 */
export const getTimeRange = (type: 'today' | 'yesterday' | 'week' | 'month' | 'year'): [dayjs.Dayjs, dayjs.Dayjs] => {
  const now = dayjs()
  
  switch (type) {
    case 'today':
      return [now.startOf('day'), now.endOf('day')]
    case 'yesterday':
      const yesterday = now.subtract(1, 'day')
      return [yesterday.startOf('day'), yesterday.endOf('day')]
    case 'week':
      return [now.startOf('week'), now.endOf('week')]
    case 'month':
      return [now.startOf('month'), now.endOf('month')]
    case 'year':
      return [now.startOf('year'), now.endOf('year')]
    default:
      return [now.startOf('day'), now.endOf('day')]
  }
}

/**
 * 转换时区
 * @param date 日期
 * @param timezone 目标时区
 * @returns 转换后的日期
 */
export const convertTimezone = (date: string | Date | dayjs.Dayjs, timezone: string): dayjs.Dayjs => {
  return dayjs(date).tz(timezone)
}

/**
 * 获取当前时区
 * @returns 当前时区
 */
export const getCurrentTimezone = (): string => {
  return dayjs.tz.guess()
}

export default {
  formatDate,
  formatRelativeTime,
  formatFriendlyDate,
  isToday,
  isThisWeek,
  isThisMonth,
  getTimeRange,
  convertTimezone,
  getCurrentTimezone
}