/**
 * @description 时间日期转换
 * @param date 当前时间，new Date() 格式
 * @param format 需要转换的时间格式字符串
 * @description format 字符串随意，如 `YYYY-mm、YYYY-mm-dd`
 * @description format 季度："YYYY-mm-dd HH:MM:SS QQQQ"
 * @description format 星期："YYYY-mm-dd HH:MM:SS WWW"
 * @description format 几周："YYYY-mm-dd HH:MM:SS ZZZ"
 * @description format 季度 + 星期 + 几周："YYYY-mm-dd HH:MM:SS WWW QQQQ ZZZ"
 * @returns {string} 返回拼接后的时间字符串
 */
export function formatDate(date: any, format: string): string {
	if (!date) return '';
	date = new Date(date);
	let we = date.getDay(); // 星期
	let z = getWeek(date); // 周
	let qut = Math.floor((date.getMonth() + 3) / 3).toString(); // 季度
	const opt: { [key: string]: string } = {
		'Y+': date.getFullYear().toString(), // 年
		'm+': (date.getMonth() + 1).toString(), // 月(月份从0开始，要+1)
		'd+': date.getDate().toString(), // 日
		'H+': date.getHours().toString(), // 时
		'M+': date.getMinutes().toString(), // 分
		'S+': date.getSeconds().toString(), // 秒
		'q+': qut, // 季度
	};
	// 中文数字 (星期)
	const week: { [key: string]: string } = {
		'0': '日',
		'1': '一',
		'2': '二',
		'3': '三',
		'4': '四',
		'5': '五',
		'6': '六',
	};
	// 中文数字（季度）
	const quarter: { [key: string]: string } = {
		'1': '一',
		'2': '二',
		'3': '三',
		'4': '四',
	};
	if (/(W+)/.test(format))
		format = format.replace(RegExp.$1, RegExp.$1.length > 1 ? (RegExp.$1.length > 2 ? '星期' + week[we] : '周' + week[we]) : week[we]);
	if (/(Q+)/.test(format)) format = format.replace(RegExp.$1, RegExp.$1.length == 4 ? '第' + quarter[qut] + '季度' : quarter[qut]);
	if (/(Z+)/.test(format)) format = format.replace(RegExp.$1, RegExp.$1.length == 3 ? '第' + z + '周' : z + '');
	for (let k in opt) {
		let r = new RegExp('(' + k + ')').exec(format);
		// 若输入的长度不为1，则前面补零
		if (r) format = format.replace(r[1], RegExp.$1.length == 1 ? opt[k] : opt[k].padStart(RegExp.$1.length, '0'));
	}
	return format;
}

/**
 * @description 获取当前日期是第几周
 * @param dateTime 当前传入的日期值
 * @returns {number} 返回第几周数字值
 */
export function getWeek(dateTime: Date): number {
	let temptTime = new Date(dateTime.getTime());
	// 周几
	let weekday = temptTime.getDay() || 7;
	// 周1+5天=周六
	temptTime.setDate(temptTime.getDate() - weekday + 1 + 5);
	let firstDay = new Date(temptTime.getFullYear(), 0, 1);
	let dayOfWeek = firstDay.getDay();
	let spendDay = 1;
	if (dayOfWeek != 0) spendDay = 7 - dayOfWeek + 1;
	firstDay = new Date(temptTime.getFullYear(), 0, 1 + spendDay);
	let d = Math.ceil((temptTime.valueOf() - firstDay.valueOf()) / 86400000);
	return Math.ceil(d / 7);
}

/**
 * @description 时间问候语
 * @param param 当前时间，new Date() 格式
 * @description param 调用 `formatAxis(new Date())` 输出 `上午好`
 * @returns {String} 返回拼接后的时间字符串
 */
export function formatAxis(param: Date): string {
	let hour: number = new Date(param).getHours();
	// if (hour < 6) return '凌晨好';
	if (hour < 9) return '早上好';
	else if (hour < 12) return '上午好';
	// else if (hour < 14) return '中午好';
	else if (hour < 18) return '下午好';
	// else if (hour < 19) return '傍晚好';
	else if (hour < 24) return '晚上好';
	else return '夜里好';
}
/**
 * @description 秒转换成xx:xx:xx格式
 * @param time 传入秒
 * @param isMillisecond 是否是毫秒
 * @param showHour 是否展示小时 默认是
 * @description param 调用 `formatDuration(秒) 转换成xx:xx:xx的格式
 * @returns {string} 输出 即xx:xx:xx的格式；
 */
export function formatDuration(time: any, showHour: boolean = true, isMillisecond = false) {
	if (!time) return showHour ? '00:00:00' : '00:00';
	if (isMillisecond) {
		time = Math.floor(time / 1000);
	}
	if (time > -1) {
		const hour = Math.floor(time / 3600);
		const min = Math.floor(time / 60) % 60;
		const sec = time % 60;
		if (showHour) {
			// 是否要展示小时
			if (hour < 10) {
				time = '0' + hour + ':';
			} else {
				time = hour + ':';
			}
		} else {
			time = '';
		}
		if (min < 10) {
			time += '0';
		}
		time += min + ':';
		if (sec < 10) {
			time += '0';
		}
		time += sec;
	}
	return time;
}
/**
 * @description 秒转换成xx天:xx小时:xx分钟xx秒格式
 * @param time 传入秒
 * @param isMillisecond 是否是毫秒
 * @returns {string} 输出 即xx天:xx小时:xx分钟xx秒格式
 */
export function formatDurationDay(time: any, isMillisecond = false) {
	if (!time) return '0秒';
	if (isMillisecond) {
		time = Math.floor(time / 1000);
	}
	if (time > -1) {
		const day = Math.floor(time / 86400);
		const hour = Math.floor((time % 86400) / 3600);
		const min = Math.floor((time % 3600) / 60);
		const sec = ( time % 60).toFixed(0);
		let str = '';
		if (day) {
			str += day + '天';
		}
		if (hour) {
			str += hour + '小时';
		}
		if (min) {
			str += min + '分钟';
		}
		if (sec) {
			str += sec + '秒';
		}
		return str;
	}
	return '0秒';
}
