/** 日期扩展 */

export default () => {

	if (!Date.prototype.format) {
		/**
		 * 格式化日期
		 * @param {String} fmt 字符串表达式
		 * @return {String} 
		 * @example
		 * new Date().format('yyyy-MM-dd hh:mm:ss.S'); //2018-09-02 08:09:04.423
		 * new Date().format('yyyy-M-d h:m:s.S'); //2018-9-2 8:9:4.423 
		 */
		Date.prototype.format = function (fmt) {
			let o = {
				'M+': this.getMonth() + 1,                      //月份 
				'd+': this.getDate(),                           //日 
				'h+': this.getHours(),                          //小时 
				'm+': this.getMinutes(),                        //分 
				's+': this.getSeconds(),                        //秒 
				'S': this.getMilliseconds()                     //毫秒 
			};
			for (let time in o) {
				if (isNaN(o[time])) {
					return '';
				};
			};
			if (/(y+)/.test(fmt)) {
				fmt = fmt.replace(RegExp.$1, (this.getFullYear() + '').slice(4 - RegExp.$1.length));
			}
			for (let k in o) {
				if (new RegExp('(' + k + ')').test(fmt)) {
					fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (('00' + o[k]).slice(('' + o[k]).length)));
				}
			}

			return fmt;
		};
	};

	if (!Date.prototype.getTimeDiffer) {
		/**
		 * 获取指定时间和Date的时间差
		 * @param {Date} targetTime 指定的时间（如果该时间晚于Date，得到的是正数，反之负数）
		 * @param {String} type d=天 h=时 m=分 s=秒（默认） ms=毫秒
		 * @return {Number} 计算出来的type时间差
		 */
		Date.prototype.getTimeDiffer = function (targetTime, type = 's') {
			let nowTime = this;
			let timeDiffer = targetTime.getTime() - nowTime.getTime();

			let differ
			switch (type) {
				case 'd':
					differ = timeDiffer / (1000 * 60 * 60 * 24);
					break;
				case 'h':
					differ = timeDiffer / (1000 * 60 * 60);
					break;
				case 'm':
					differ = timeDiffer / (1000 * 60);
					break;
				case 's':
					differ = timeDiffer / 1000;
					break;
				case 'ms':
					differ = timeDiffer;
					break;
				default:
					break;
			};

			return Math.floor(differ);
		};
	};

	if (!Date.prototype.incMillisecond) {
		/**
		 * 将当前日期增减（负数为减少）指定毫秒数
		 * @param {Number} millisecond 毫秒数（正数增，负数减）
		 * @return {Date} 新的日期
		 */
		Date.prototype.incMillisecond = function (millisecond) {
			return new Date(this.getTime() + Math.round(millisecond));
		};
	};

	if (!Date.prototype.getWeekDate) {
		/**
		 * 获得指定日期的开始日期和结束（周一算第一天）
		 * @return {[Date, Date]} 日期数组 下标0开始日期；下标1结束日期
		 */
		Date.prototype.getWeekDate = function () {
			// 第几天
			let nowDayOfWeek = this.getDay() == 0 ? 7 : this.getDay();
			// 当前日
			let nowDay = this.getDate();
			// 当前月
			let nowMonth = this.getMonth();
			// 当前年
			let nowYear = this.getYear();
			nowYear += (nowYear < 2000) ? 1900 : 0;

			let weekStartDate = new Date(nowYear, nowMonth, nowDay - nowDayOfWeek + 1);
			let weekEndDate = new Date(nowYear, nowMonth, nowDay + (7 - nowDayOfWeek));

			return [weekStartDate, weekEndDate];
		};
	};

	if (!Date.prototype.clone) {
		/**
		 * 深拷贝日期
		 * @return {Date} 新的日期
		 */
		Date.prototype.clone = function () {
			return new Date(this.valueOf());
		};
	};

	if (!Date.prototype.isEqual) {
		/**
		 * 是否同一年（月、日、小时等）
		 * @param {Date} 需要比较的日期
		 * @param {String} s y年 m月 d日 h小时 m分 s秒 S毫秒
		 */
		Date.prototype.isEqual = function (date, s = 'd') {
			switch (s) {
				case 'y': return this.getFullYear() === date.getFullYear();
				case 'm': return this.getMonth() === date.getMonth();
				case 'd': return this.getDate() === date.getDate();
				case 'h': return this.getHours() === date.getHours();
				case 'm': return this.getMinutes() === date.getMinutes();
				case 's': return this.getSeconds() === date.getSeconds();
				case 'S': return this.getMilliseconds() === date.getMilliseconds();
				default: return false;
			};
		};
	}
};
