
import Taro from '@tarojs/taro'

export const MILLISECONDS_A_SECOND = 1e3
export const MILLISECONDS_A_MINUTE = 60 * MILLISECONDS_A_SECOND
export const MILLISECONDS_A_HOUR = 60 * MILLISECONDS_A_MINUTE
export const MILLISECONDS_A_DAY = 24 * MILLISECONDS_A_HOUR

export const diff = (dt1, dt2) => {
  if (!dt1 || !dt2) return [];

  const bw = new Date(dt1) - new Date(dt2)
  const day = Math.floor(bw / MILLISECONDS_A_DAY)
  const hour = Math.floor(bw % MILLISECONDS_A_DAY / MILLISECONDS_A_HOUR)
  const min = Math.floor(bw % MILLISECONDS_A_DAY % MILLISECONDS_A_HOUR / MILLISECONDS_A_MINUTE)
  const sec = Math.floor(bw % MILLISECONDS_A_DAY % MILLISECONDS_A_HOUR % MILLISECONDS_A_MINUTE / MILLISECONDS_A_SECOND)
  return [bw, day, hour, min, sec]
}

export function getDateByStr(dtStr) {
  if (!dtStr) return undefined;

  const t = dtStr.split(/[-T :]/);

  return new Date(t[0], t[1]-1, t[2], t[3] || 0, t[4] || 0, t[5] || 0)
}

//例子 getDateFormat(new Date().valueOf(),true,'yyyy/M/d')
export function formatDate(dt, fmt) {
  if (!dt) return dt;

  // 解决苹果手机不能正常初始化的问题
  const date = typeof dt === 'string' ? getDateByStr(dt) : new Date(dt);

  var o = {
    "M+": date.getMonth() + 1, //月份
    "d+": date.getDate(), //日
    "h+": date.getHours(), //小时
    "m+": date.getMinutes(), //分
    "s+": date.getSeconds(), //秒
    "q+": Math.floor((date.getMonth() + 3) / 3), //季度
    "S": date.getMilliseconds() //毫秒
  };
  if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
  for (var k in o)
    if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
  return fmt;
};


/**
* 仿照微信中的消息时间显示逻辑，将时间戳（单位：毫秒）转换为友好的显示格式.
*
* 1）7天之内的日期显示逻辑是：今天、昨天(-1d)、前天(-2d)、星期？（只显示总计7天之内的星期数，即<=-4d）；
* 2）7天之外（即>7天）的逻辑：直接显示完整日期时间。
*
* @param  {[string|date]} dt 时间
* @param {boolean} mustIncludeTime true表示输出的格式里一定会包含“时间:分钟”
* ，否则不包含（参考微信，不包含时分的情况，用于首页“消息”中显示时）
*
* @return {string} 输出格式形如：“刚刚”、“10:30”、“昨天 12:04”、“前天 20:51”、“星期二”、“2019/2/21 12:09”等形式
* @since 1.1
*/
export function getDateForHumans(dt, mustIncludeTime, format='yyyy-M-d') {

  // 当前时间
  var currentDate = new Date();
  // 目标判断时间
  var srcDate = new Date(dt);

  var currentYear = currentDate.getFullYear();
  var currentMonth = (currentDate.getMonth() + 1);
  var currentDateD = currentDate.getDate();

  var srcYear = srcDate.getFullYear();
  var srcMonth = (srcDate.getMonth() + 1);
  var srcDateD = srcDate.getDate();

  var ret = "";

  // 要额外显示的时间分钟
  var timeExtraStr = (mustIncludeTime ? " " + formatDate(srcDate, "hh:mm") : "");

  // 当年
  if (currentYear == srcYear) {
    // 相差时间（单位：毫秒）
    var deltaTime = (currentDate - srcDate);

    // 当天（月份和日期一致才是）
    if (currentMonth == srcMonth && currentDateD == srcDateD) {
      // 时间相差60秒以内
      if (deltaTime < 60 * 1000)
        ret = "刚刚";
      // 否则当天其它时间段的，直接显示“时:分”的形式
      else
        ret = formatDate(srcDate, "hh:mm");
    }
    // 当年 && 当天之外的时间（即昨天及以前的时间）
    else {
      // 昨天（以“现在”的时候为基准-1天）
      var yesterdayDate = new Date();
      yesterdayDate.setDate(yesterdayDate.getDate() - 1);

      // 前天（以“现在”的时候为基准-2天）
      var beforeYesterdayDate = new Date();
      beforeYesterdayDate.setDate(beforeYesterdayDate.getDate() - 2);

      // 用目标日期的“月”和“天”跟上方计算出来的“昨天”进行比较，是最为准确的（如果用时间戳差值
      // 的形式，是不准确的，比如：现在时刻是2019年02月22日1:00、而srcDate是2019年02月21日23:00，
      // 这两者间只相差2小时，直接用“deltaTime/(3600 * 1000)” > 24小时来判断是否昨天，就完全是扯蛋的逻辑了）
      if (srcMonth == (yesterdayDate.getMonth() + 1) && srcDateD == yesterdayDate.getDate())
        ret = "昨天" + timeExtraStr;// -1d
      // “前天”判断逻辑同上
      else if (srcMonth == (beforeYesterdayDate.getMonth() + 1) && srcDateD == beforeYesterdayDate.getDate())
        ret = "前天" + timeExtraStr;// -2d
      else {
        // 跟当前时间相差的小时数
        var deltaHour = (deltaTime / (3600 * 1000));

        // 如果小于或等 7*24小时就显示星期几
        if (deltaHour <= 7 * 24) {
          var weekday = new Array(7);
          weekday[0] = "星期日";
          weekday[1] = "星期一";
          weekday[2] = "星期二";
          weekday[3] = "星期三";
          weekday[4] = "星期四";
          weekday[5] = "星期五";
          weekday[6] = "星期六";

          // 取出当前是星期几
          var weedayDesc = weekday[srcDate.getDay()];
          ret = weedayDesc + timeExtraStr;
        }
        // 否则直接显示完整日期时间
        else
          ret = formatDate(srcDate, format) + timeExtraStr;
      }
    }
  }
  // 往年
  else {
    ret = formatDate(srcDate, format) + timeExtraStr;
  }
  return ret;
};