import dayjs from 'dayjs';
import cronParser from 'cron-parser';
import utc from 'dayjs/plugin/utc';
import timezone from 'dayjs/plugin/timezone';
import { i18nT } from '../../../web/i18n/utils';

dayjs.extend(utc);
dayjs.extend(timezone);

export const formatTime2YMDHMW = (time?: Date | number) =>
  dayjs(time).format('YYYY-MM-DD HH:mm:ss dddd');
export const formatTime2YMDHMS = (time?: Date | number) =>
  time ? dayjs(time).format('YYYY-MM-DD HH:mm:ss') : '';
export const formatTime2YMDHM = (time?: Date | number) =>
  time ? dayjs(time).format('YYYY-MM-DD HH:mm') : '';
export const formatTime2YMD = (time?: Date | number) =>
  time ? dayjs(time).format('YYYY-MM-DD') : '';
export const formatTime2HM = (time: Date = new Date()) => dayjs(time).format('HH:mm');

/**
 * 格式化时间成聊天格式
 */
export const formatTimeToChatTime = (time: Date) => {
  const now = dayjs();
  const target = dayjs(time);

  // 如果传入时间小于60秒，返回刚刚
  if (now.diff(target, 'second') < 60) {
    return i18nT('common:just_now');
  }

  // 如果时间是今天，展示几时:几分
  //用#占位，i18n生效后replace成:
  if (now.isSame(target, 'day')) {
    return target.format('HH#mm');
  }

  // 如果是昨天，展示昨天
  if (now.subtract(1, 'day').isSame(target, 'day')) {
    return i18nT('common:yesterday');
  }

  // 如果是今年，展示某月某日
  if (now.isSame(target, 'year')) {
    return target.format('MM-DD');
  }

  // 如果是更久之前，展示某年某月某日
  return target.format('YYYY-M-D');
};

export const formatTimeToChatItemTime = (time: Date) => {
  const now = dayjs();
  const target = dayjs(time);
  const detailTime = target.format('HH#mm');

  // 如果时间是今天，展示几时:几分
  if (now.isSame(target, 'day')) {
    return detailTime;
  }

  // 如果是昨天，展示昨天+几时:几分
  if (now.subtract(1, 'day').isSame(target, 'day')) {
    return i18nT('common:yesterday_detail_time');
  }

  // 如果是今年，展示某月某日+几时:几分
  if (now.isSame(target, 'year')) {
    return target.format('MM-DD') + ' ' + detailTime;
  }

  // 如果是更久之前，展示某年某月某日+几时:几分
  return target.format('YYYY-M-D') + ' ' + detailTime;
};

/* cron time parse */
export const cronParser2Fields = (cronString: string) => {
  try {
    const cronField = cronParser.parseExpression(cronString).fields;
    return cronField;
  } catch (error) {
    return null;
  }
};
// 根据cron表达式和时区获取下一个时间
export const getNextTimeByCronStringAndTimezone = ({
  cronString,
  timezone
}: {
  cronString: string;
  timezone: string;
}) => {
  try {
    const options = {
      currentDate: dayjs().tz(timezone).format(),
      tz: timezone
    };
    const interval = cronParser.parseExpression(cronString, options);
    const date = String(interval.next());

    return new Date(date);
  } catch (error) {
    console.log(`getNextTimeByCronStringAndTimezone error: ${cronString}`, error);
    return new Date();
  }
};
