package jnpf.util;

import cn.hutool.core.date.DateTime;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Date;
import java.util.HashMap;
import java.util.Objects;
@Slf4j
public class DateConvertUtil {
    /**
     * 计算时间差
     *
     * @param startTime       开始时间
     * @param endTime         结束时间
     * @param returnType      返回值类型（1-分钟 2- 小时 3-天）
     * @param scale           保留小数位
     * @param attendanceRatio 换算比（小时折算天）
     * @return
     */
    public static BigDecimal dateConvert(Date startTime, Date endTime, Integer returnType, Integer scale, BigDecimal attendanceRatio) {
        long diffMillis = endTime.getTime() - startTime.getTime();
        BigDecimal returnData = BigDecimal.ZERO;
        switch (returnType) {
            case 1: {
                returnData = new BigDecimal(diffMillis).divide(new BigDecimal(60 * 1000), scale, RoundingMode.HALF_UP);
                break;
            }
            case 2: {
                returnData = new BigDecimal(diffMillis).divide(new BigDecimal(60 * 60 * 1000), scale, RoundingMode.HALF_UP);
                break;
            }
            case 3: {
                returnData = new BigDecimal(diffMillis).divide(attendanceRatio.multiply(new BigDecimal(60 * 60 * 1000)), scale, RoundingMode.HALF_UP);
                break;
            }
        }
        return returnData;
    }

    /**
     * 分钟换位
     *
     * @param number          分钟数
     * @param returnType      返回值类型（1- 小时 2-天）
     * @param scale           保留小数位
     * @param attendanceRatio 换算比（小时折算天）
     * @return
     */
    public static BigDecimal minuteConvert(BigDecimal number, Integer returnType, Integer scale, BigDecimal attendanceRatio) {
        BigDecimal returnData = BigDecimal.ZERO;
        switch (returnType) {
            case 1: {
                returnData = number.divide(new BigDecimal(60), scale, RoundingMode.HALF_UP);
                break;
            }
            case 2: {
                returnData = number.divide(new BigDecimal(60).multiply(attendanceRatio), scale, RoundingMode.HALF_UP);
                break;
            }
        }
        return returnData;
    }

    /**
     * 秒换位
     *
     * @param number          秒数
     * @param returnType      返回值类型（1- 分钟  2-小时  3-天）
     * @param scale           保留小数位
     * @param attendanceRatio 换算比（小时折算天）
     * @return
     */
    public static BigDecimal secondConvert(Integer number, Integer returnType, Integer scale, BigDecimal attendanceRatio) {
        BigDecimal returnData = BigDecimal.ZERO;
        switch (returnType) {
            case 1: {
                returnData = new BigDecimal(number).divide(new BigDecimal(60), scale, RoundingMode.HALF_UP);
                break;
            }
            case 2: {
                returnData = new BigDecimal(number).divide(new BigDecimal(60 * 60), scale, RoundingMode.HALF_UP);
                break;
            }
            case 3: {
                returnData = new BigDecimal(number).divide(new BigDecimal(60 * 60).multiply(attendanceRatio), scale, RoundingMode.HALF_UP);
                break;
            }
        }
        return returnData;
    }
    public static HashMap<String, DateTime> setOverlap(DateTime startDate1,
                                                       DateTime endDate1, DateTime startDate2, DateTime endDate2, boolean isStrict) throws Exception {
        HashMap<String, DateTime> intersection = new HashMap<>();
        if (endDate1.compareTo(startDate1) < 0) {
            return null;
        }
        if (endDate2.compareTo(startDate2) < 0) {
            return null;
        }
        if (isStrict) {
            if (!(endDate1.getTime() <= startDate2.getTime() || startDate1.getTime() >= endDate2.getTime())) {
                //存在交集 取 两个时间中最大的开始时间和最小的结束时间
                intersection.put("startDate", startDate1.getTime() < startDate2.getTime() ? startDate2 : startDate1);
                intersection.put("endDate", endDate1.getTime() < endDate2.getTime() ? endDate1 : endDate2);
            }
        } else {
            if (!(endDate1.getTime() < startDate2.getTime() || startDate1.getTime() > endDate2.getTime())) {
                //存在交集 取 两个时间中最大的开始时间和最小的结束时间
                intersection.put("startDate", startDate1.getTime() < startDate2.getTime() ? startDate2 : startDate1);
                intersection.put("endDate", endDate1.getTime() < endDate2.getTime() ? endDate1 : endDate2);
            }
        }
        return intersection;
    }

    /**
     * 判断2个时间段是否有重叠（交集）
     *
     * @param startDate1 时间段1开始时间
     * @param endDate1   时间段1结束时间
     * @param startDate2 时间段2开始时间
     * @param endDate2   时间段2结束时间
     * @param isStrict   是否严格重叠，true 严格，没有任何相交或相等；false 不严格，可以首尾相等
     * @return ashMap<String, DateTime> key  startDate endDate
     */
    public static HashMap<String, DateTime> getOverlap(DateTime startDate1,DateTime endDate1, DateTime startDate2, DateTime endDate2, boolean isStrict) throws Exception {
        Objects.requireNonNull(startDate1, "startDate1");
        Objects.requireNonNull(endDate1, "endDate1");
        Objects.requireNonNull(startDate2, "startDate2");
        Objects.requireNonNull(endDate2, "endDate2");
        return setOverlap(startDate1, endDate1, startDate2, endDate2, isStrict);
    }
    public static void main(String[] args) {
        DateTime startDate1 = new DateTime(DateUtil.stringToDates("2024-01-28"));
        DateTime endDate1 = new DateTime(DateUtil.stringToDates("2024-01-31"));
        DateTime startDate2 = new DateTime(DateUtil.stringToDates("2024-01-29"));
        DateTime endDate2 = new DateTime(DateUtil.stringToDates("2024-02-28"));
        try {
            HashMap<String, DateTime> hashMap = getOverlap(startDate1, endDate1, startDate2, endDate2, false);
            log.error("交叉数据：{}", JSON.toJSON(hashMap));
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}
