/**
 * 传入时间按指定格式生成
 * @param dateTime 指定时间
 * @param format 时间格式
 * @returns 
 */
export function dateTimestr(date: Date, format: string) {
    const map: { [key: string]: number | Function } = {
        '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()
    };

    format = format.replace(/([yMdhsqS])+/g, (all, key) => {
        let value = map[key];
        if (value !== undefined) {
            if (all.length > 1) {
                value = `0${value}`.slice(-2) as any;
            }
            return value.toString();
        } else if (key === 'y') {
            return date.getFullYear().toString();
        }
        return all;
    });

    // 将'-'替换成'/'
    return format.replace(/-/g, '/');
}
/**
 * 获取上个月时间
 * @param date 时间
 * @returns 
 */
export function getPreMonth(date: string) {
    const arr = date.split('/');
    const year = Number(arr[0]); //获取当前日期的年份
    const month = Number(arr[1]); //获取当前日期的月份
    const day = Number(arr[2]); //获取当前日期的日
    let days = new Date(year, month, 0);
    days = days.getDate() as never; //获取当前日期中月的天数
    let year2 = year;
    let month2 = month - 1;
    if (month2 == 0) {
        year2 = year2 - 1;
        month2 = 12;
    }
    let day2 = day;
    let days2 = new Date(year2, month2, 0) as any;
    days2 = days2.getDate() as never;
    if (day2 > days2) {
        day2 = days2;
    }
    if (month2 < 10) {
        month2 = '0' + month2 as never;
    }
    const t2 = year2 + '/' + month2 + '/' + day2;
    return t2;
}

/**
 * 
 * @param date 解析的时间
 * @returns 系统的时间格式
 */
export function newDate(date: string) {
    return new Date(date);
}

/**
 * 获取年-月
 */
export function getMonth() {
    const now = new Date();
    const year = now.getFullYear();
    const month = now.getMonth() + 1;
    const newMonth = month > 9 ? month : `0${month}`
    return `${year}-${newMonth}`
}

/**
 * 获取上月份
 */
export function getPresMonth() {
    const now = new Date();
    let year = now.getFullYear();
    let month = now.getMonth() + 1;
    if (month === 1) {
        year -= 1;
        month = 12;
    } else {
        month -= 1;
    }
    const lastMonth = `${year}-${month.toString().padStart(2, '0')}`;
    return lastMonth
}

/**
 * 时间格式化
 * @param date Date
 * @returns 时间格式：YYYY-MM-DD
 */
export function formatDate(date: Date) {
    const year = date.getFullYear();
    const month = String(date.getMonth() + 1).padStart(2, '0');
    const day = String(date.getDate()).padStart(2, '0');
    return year + '-' + month + '-' + day;
}

/**
 * 月初与月底日期,时间格式为：YYYY-MM-DD hh:mm
 * @returns 时间格式：[YYYY-MM-DD hh:mm,YYYY-MM-DD hh:mm]
 */
export function getMonthStartAndEndDates() {
    // 获取当前时间
    const currentDate = new Date();
    
    // 计算结束日期是当前日期的后一天
    const endDate = new Date(currentDate);
    endDate.setDate(endDate.getDate() + 1);

    // 格式化结束日期
    const endFormattedDate = getFormatDate(endDate);

    // 计算开始日期是结束日期的前一个月
    const startDate = new Date(endDate);
    startDate.setMonth(startDate.getMonth() - 1);
    
    // 格式化开始日期
    const startFormattedDate = getFormatDate(startDate);

    // 返回格式化的起始和结束日期，并在时间上设置到 06:00
    return [startFormattedDate + ' 06:00', endFormattedDate + ' 06:00'];
}
/**
 * 今天与明天,时间格式为：YYYY-MM-DD hh:mm
 * @returns 时间格式：[YYYY-MM-DD hh:mm:ss,YYYY-MM-DD hh:mm:ss]
 */
export function getStartDayAndNextDay() {
    // 获取当前时间
    const currentDate = new Date();
    // 格式化结束日期
    const currentFormattedDate = getFormatDate(currentDate);

    const endtDate = new Date(currentDate);
    endtDate.setDate(currentDate.getDate() + 1);
    
    // 格式化开始日期
    const endFormattedDate = getFormatDate(endtDate);

    // 返回格式化的起始和结束日期，并在时间上设置到 06:00
    return [currentFormattedDate + ' 06:00:00', endFormattedDate + ' 06:00:00'];
}
/**
 * 获取格式时间 YYYY-MM-DD
 * @param date new Date
 * @returns 
 */
export function getFormatDate(date) {
    const year = date.getFullYear();
    const month = String(date.getMonth() + 1).padStart(2, '0');
    const day = String(date.getDate()).padStart(2, '0');
    return `${year}-${month}-${day}`;
}

/**
 * 获取当前时间以及上个星期时间
 * @returns 日期格式化为"YYYY-MM-DD"
 */
export function getCurrentDateAndPretDate() {
    // 获取当前时间
    const currentDate = new Date();
    const formattedDate = formatDate(currentDate)
    // 减去一周的时间（一周的毫秒数为7天 * 24小时 * 60分钟 * 60秒 * 1000毫秒）
    const oneWeekAgo = new Date(currentDate.getTime() - 7 * 24 * 60 * 60 * 1000);
    // 将日期格式化为"YYYY-MM-DD"
    const lastWeekDate = oneWeekAgo.getFullYear() + "-" +
        ("0" + (oneWeekAgo.getMonth() + 1)).slice(-2) + "-" +
        ("0" + oneWeekAgo.getDate()).slice(-2)

    return {
        formattedDate, 
        lastWeekDate,
    }
}

/**
 * 间隔时间
 * @param d 
 * @param days 
 * @returns 
 */
export function addDays(d, days) {
    const adjustDate = new Date(d.getTime() + 24 * 60 * 60 * 1000 * days);
    return adjustDate;
}