package cn.cecep.talroad.util;

import cn.cecep.talroad.vo.ChartVo;
import cn.hutool.core.util.ArrayUtil;
import org.apache.commons.compress.utils.Lists;
import org.springframework.util.CollectionUtils;

import java.text.SimpleDateFormat;
import java.util.*;

public class CustomDateUtil {

    public final static String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";

    public final static String HOUR_PATTERN = "yyyy-MM-dd HH";

    public final static String DATE_PATTERN = "yyyy-MM-dd";

    public final static String DATE_PATTERN_MONTH = "yyyy-MM";

    public final static String DATE_PATTERN_YEAR = "yyyy";

    /**
     * 获取时间范围内的所有的天(yyyy-MM-dd)
     *
     * @param startTime
     * @param endTime
     * @param pattern   yyyy-MM-dd
     * @return
     */
    public static List<String> getAllDays(Date startTime, Date endTime, String pattern) {

        List<String> lDate = new ArrayList<String>();
        SimpleDateFormat sd = new SimpleDateFormat(pattern);
        lDate.add(sd.format(startTime));
        Calendar calBegin = Calendar.getInstance();
        // 使用给定的 Date 设置此 Calendar 的时间
        calBegin.setTime(startTime);

        Calendar calEnd = Calendar.getInstance();
        // 使用给定的 Date 设置此 Calendar 的时间
        calEnd.setTime(endTime);
        // 测试此日期是否在指定日期之后
        while (endTime.after(calBegin.getTime())) {
            // 根据日历的规则，为给定的日历字段添加或减去指定的时间量
            calBegin.add(Calendar.DAY_OF_MONTH, 1);
            lDate.add(sd.format(calBegin.getTime()));
        }
        return lDate;
    }

    /**
     * 获取时间范围内的所有的年(yyyy)
     *
     * @param startTime
     * @param endTime
     * @param pattern   yyyy
     * @return
     */
    public static List<String> getAllYears(Date startTime, Date endTime, String pattern) {

        List<String> lDate = new ArrayList<String>();
        SimpleDateFormat sd = new SimpleDateFormat(pattern);
        lDate.add(sd.format(startTime));
        Calendar calBegin = Calendar.getInstance();
        // 使用给定的 Date 设置此 Calendar 的时间
        calBegin.setTime(startTime);

        Calendar calEnd = Calendar.getInstance();
        // 使用给定的 Date 设置此 Calendar 的时间
        calEnd.setTime(endTime);
        // 测试此日期是否在指定日期之后
        while (endTime.after(calBegin.getTime())) {
            // 根据日历的规则，为给定的日历字段添加或减去指定的时间量
            calBegin.add(Calendar.YEAR, 1);
            lDate.add(sd.format(calBegin.getTime()));
        }
        return lDate;
    }

    /**
     * 获取时间范围内的所有的月(yyyy-MM)
     *
     * @param startTime
     * @param endTime
     * @param pattern   yyyy-MM
     * @return
     */
    public static List<String> getAllMonths(Date startTime, Date endTime, String pattern) {

        List<String> lDate = new ArrayList<String>();
        SimpleDateFormat sd = new SimpleDateFormat(pattern);
        lDate.add(sd.format(startTime));
        Calendar calBegin = Calendar.getInstance();
        // 使用给定的 Date 设置此 Calendar 的时间
        calBegin.setTime(startTime);

        Calendar calEnd = Calendar.getInstance();
        // 使用给定的 Date 设置此 Calendar 的时间
        calEnd.setTime(endTime);
        // 测试此日期是否在指定日期之后
        while (endTime.after(calBegin.getTime())) {
            // 根据日历的规则，为给定的日历字段添加或减去指定的时间量
            calBegin.add(Calendar.MONTH, 1);
            lDate.add(sd.format(calBegin.getTime()));
        }
        return lDate;
    }

    /**
     * 获取时间范围内的所有的小时(yyyy-MM-dd HH)
     *
     * @param startTime
     * @param endTime
     * @param pattern   yyyy-MM-dd HH
     * @return
     */
    public static List<String> getAllHours(Date startTime, Date endTime, String pattern) {

        List<String> lDate = new ArrayList<String>();
        SimpleDateFormat sd = new SimpleDateFormat(pattern);
        lDate.add(sd.format(startTime));
        Calendar calBegin = Calendar.getInstance();
        // 使用给定的 Date 设置此 Calendar 的时间
        calBegin.setTime(startTime);

        Calendar calEnd = Calendar.getInstance();
        // 使用给定的 Date 设置此 Calendar 的时间
        calEnd.setTime(endTime);
        // 测试此日期是否在指定日期之后
        while (endTime.after(calBegin.getTime())) {
            // 根据日历的规则，为给定的日历字段添加或减去指定的时间量
            calBegin.add(Calendar.HOUR_OF_DAY, 1);
            lDate.add(sd.format(calBegin.getTime()));
        }
        return lDate;
    }

    /**
     * 根据xsxisDatas补全seriesData数据
     * @param chartVo
     * @param xsxisDatas
     */
    public static void packEcharts(ChartVo chartVo, List<String> xsxisDatas){
        if(chartVo == null || ArrayUtil.isEmpty(chartVo.getXsxisData()) || CollectionUtils.isEmpty(chartVo.getSeriesData()) || CollectionUtils.isEmpty(xsxisDatas)){
            return;
        }
        if(chartVo.getXsxisData().length != xsxisDatas.size()){
            List<Integer> xIndexs = Lists.newArrayList();
            for (int i = 0; i < chartVo.getXsxisData().length; i++) {
                int index = xsxisDatas.indexOf(chartVo.getXsxisData()[i]);
                if(index != -1){
                    xIndexs.add(index);
                }
            }
            List<Map<Object, Object>> seriesData = chartVo.getSeriesData();
            for (int i = 0; i < seriesData.size(); i++) {
                Map<Object, Object> objectObjectMap = seriesData.get(i);
                if(!(objectObjectMap.get("data") instanceof List)){
                    return;
                }
                ArrayList<Object> sourceData = (ArrayList<Object>) objectObjectMap.get("data");
                List<Object> targetData = new ArrayList<>(xsxisDatas.size());
                Integer sourceIndex = 0;
                for (int j = 0; j < xsxisDatas.size(); j++) {
                    int xIndex = xIndexs.indexOf(j);
                    if( xIndex == -1){
                        targetData.add(j, "--");
                    } else {
                        targetData.add(xIndexs.get(xIndex), sourceData.get(sourceIndex));
                        sourceIndex++;
                    }
                }
                objectObjectMap.put("data", targetData);
            }
            chartVo.setXsxisData(xsxisDatas.stream().toArray());
        }
    }
}
