package com.zhgd.xmgl.util.mysql;

import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;

import java.util.Map;
import java.util.TreeMap;
import java.util.function.Supplier;

/**
 * @author 邱平毅
 * @ClassName MysqlDataUtil
 * @date 2022/12/13
 * @Version 1.0
 */
public class MysqlDataUtil {
    private MysqlDataUtil() {
    }

    /**
     * 根据开始时间创建对应时间下的内容,不包含结束时间
     * 2022-01-01 ~ 2023-01-01
     *
     * @param stashDate            开始时间
     * @param endDate              结束时间
     * @param defaultValueSupplier 默认执行
     * @param pattern              日期格式化
     * @param dateField            日期缩进
     * @param <V>                  创建的Map对应value对象
     * @return
     */
    public static <V> Map<String, V> groupByDateTime(DateTime stashDate, DateTime endDate, Supplier<V> defaultValueSupplier, String pattern, DateField dateField) {
        TreeMap<String, V> map = new TreeMap<>();
        do {
            map.put(stashDate.toString(pattern), defaultValueSupplier.get());
            stashDate = DateUtil.offset(stashDate, dateField, 1);
        } while (stashDate.getTime() <= endDate.getTime());
        return map;
    }

    /**
     * 根据字符串格式下的开始结束时间获取对应区间所有Map数据,不包含结束时间
     * 2022-01-01 ~ 2023-01-01
     *
     * @param stashStr     开始时间字符串
     * @param endStr       结束时间字符串
     * @param defaultValue 默认值
     * @param pattern      日期格式化
     * @param dateField    日期缩进
     * @param <V>          创建的Map对应value对象
     * @return
     */
    public static <V> Map<String, V> groupByStr(String stashStr, String endStr, V defaultValue, String pattern, DateField dateField) {
        DateTime stashDate = DateUtil.parse(stashStr, pattern);
        // 默认当前时间
        DateTime endDate = DateUtil.parse(endStr == null ? DateUtil.now() : endStr, pattern);
        return groupByDateTime(stashDate, endDate, (() -> (defaultValue)), pattern, dateField);
    }
}
