import {isNull, isUndefined} from 'lodash';

class Day {
  constructor(date) {
    if (isNull(date) || isUndefined(date)) {
      this._date = new Date();
    } else {
      this._date = new Date(date);
    }

    this._init();
  }
  _init() {
    const { _date } = this;

    this._date_y = _date.getFullYear();
    this._date_M = _date.getMonth() + 1;
    this._date_D = _date.getDate();
    this._date_W = _date.getDay();
    this._date_H = _date.getHours();
    this._date_m = _date.getMinutes();
    this._date_s = _date.getSeconds();
    this._date_ms = _date.getMilliseconds();
  }
  _get(type) {
    return this[`_date_${type}`];
  }
  _fix(num, length) {
    num = num + '';

    return num.length < length ? ((new Array(length + 1)).join('0') + num).slice(-length) : num;
  }
  year() {
    return this._get('y');
  }
  month() {
    return this._get('M');
  }
  day() {
    return this._get('W');
  }
  date() {
    return this._get('D');
  }
  hour() {
    return this._get('H');
  }
  minute() {
    return this._get('m');
  }
  second() {
    return this._get('s');
  }
  millisecond() {
    return this._get('ms');
  }
  fromNow() {
    const date = this._date.getTime();
    const today = new Date(new Date().toLocaleDateString()).getTime();
    const days = Math.floor((today - date) / (24 * 60 * 60 * 1000)) + 1;

    if (days > 5) {
      return `${this.year()}-${this._fix(this.month(), 2)}-${this._fix(this.date(), 2)}`;
    } else if (days > 2) {
      return '2天前';
    } else if (days > 1) {
      return '前天';
    } else if (days > 0) {
      return '昨天';
    } else {
      return `${this.hour()}:${this._fix(this.minute(), 2)}`;
    }
  }
}

function day(date) {
  return new Day(date);
}


export default day;