package com.storlead.sales.util.report;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.time.YearMonth;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
 * @program: sp-sales-platform
 * @description:
 * @author: chenkq
 * @create: 2024-10-22 15:10
 */
public class AnalysisUtils {

    public static List<String> generateYearMonthMap() {
        // 创建 Map 来保存月份数据
        List<String> monthMap = new ArrayList<>();
        // 获取当前日期
        LocalDate currentDate = LocalDate.now();
        // 定义月份格式化方式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM");
        // 往前推12个月
        for (int i = 0; i < 12; i++) {
            // 获取当前月份的字符串
            String month = currentDate.minusMonths(i).format(formatter);
            // 将月份作为 key, 并加入到 Map 中 (value 可以是任意内容, 这里作为示例设置为 "Data")
            monthMap.add(month);
        }
        // 输出 Map
        return monthMap;
    }

    public static List<String> generateYearMonthMap(String beginDateTime, String endDateTime) {
        // 创建 Map 来保存月份数据
        List<String> monthMap = new ArrayList<>();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        // 解析日期字符串为 YearMonth 对象
        YearMonth startMonth = YearMonth.parse(beginDateTime, formatter);
        YearMonth endMonth = YearMonth.parse(endDateTime, formatter);
        // 定义月份格式化方式
        // 往前推12个月 YearMonth
        for (YearMonth month = startMonth; !month.isAfter(endMonth); month = month.plusMonths(1)) {
           monthMap.add(month.toString());
        }
        // 输出 Map
        return monthMap;
    }

    public static void main(String[] args) {
        generateYearMonthDayMap("2024-11-01","2024-12-25");
    }

    public static List<String> generateYearMonthDayMap(String beginDateTime, String endDateTime) {
        // 创建 Map 来保存月份数据
        List<String> monthMap = new ArrayList<>();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        LocalDate startDate = LocalDate.parse(beginDateTime, formatter);
        LocalDate endDate = LocalDate.parse(endDateTime, formatter);
        // 定义月份格式化方式
        // 往前推12个月
        for (LocalDate date = startDate; !date.isAfter(endDate); date = date.plusDays(1)) {
                monthMap.add(date.format(formatter));
        }
        // 输出 Map
        return monthMap;
    }

    public static List<String> generateYearMonthDayMap() {
        // 创建 Map 来保存月份数据
        List<String> monthMap = new ArrayList<>();
        // 获取当前日期
        LocalDate currentDate = LocalDate.now();
        // 定义月份格式化方式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM");
        // 往前推12个月
        for (int i = 0; i < 12; i++) {
            // 获取当前月份的字符串
            String month = currentDate.minusMonths(i).format(formatter);
            // 将月份作为 key, 并加入到 Map 中 (value 可以是任意内容, 这里作为示例设置为 "Data")
            monthMap.add(month);
        }
        // 输出 Map
        return monthMap;
    }

    /**
     * 增长率
     * @param val
     * @param val1
     * @return
     */
    public static BigDecimal computaRatio(BigDecimal val, BigDecimal val1) {
        if(Objects.isNull(val)) {
            val = BigDecimal.ZERO;
        }
        if(Objects.isNull(val1)) {
            val1 = BigDecimal.ZERO;
        }
        if(val.compareTo(val1) == 0){
            return BigDecimal.valueOf(0);
        }
        if(val.compareTo(BigDecimal.ZERO) == 0){
            return BigDecimal.valueOf(-100);
        }
        if(val1.compareTo(BigDecimal.ZERO) == 0){
            return BigDecimal.valueOf(100);
        }

        BigDecimal rate = (val.subtract(val1).multiply(BigDecimal.valueOf(100))).divide(val1,2, RoundingMode.HALF_UP);
        return rate.setScale(2, RoundingMode.HALF_UP);
    }

    /**
     * 占比
     * @param val
     * @param val1
     * @return
     */
    public static BigDecimal computaPercentage(BigDecimal val,BigDecimal val1) {
        if(Objects.isNull(val)) {
            val = BigDecimal.ZERO;
        }
        if(Objects.isNull(val1)) {
            val1 = BigDecimal.ZERO;
        }
        if(val.compareTo(BigDecimal.ZERO) == 0){
            return BigDecimal.valueOf(0);
        }
        if(val1.compareTo(BigDecimal.ZERO) == 0){
            return BigDecimal.valueOf(0);
        }
        BigDecimal rate =val.divide(val1,2,RoundingMode.HALF_UP);
        return rate.setScale(2, RoundingMode.HALF_UP).multiply(new BigDecimal(100));
    }

    /**
     * 计算两个Integer相除的百分比，并返回Long类型结果（模拟两位小数）
     *
     * @param numerator   分子
     * @param denominator 分母
     * @return Long类型的结果，模拟了两位小数
     */
    public static BigDecimal calculatePercentage(Integer num1, Integer num2) {
        if (num2 == 0) {
            return BigDecimal.ZERO;
//            throw new IllegalArgumentException("除数不能为0");
        }
        BigDecimal dividend = new BigDecimal(num1);
        BigDecimal divisor = new BigDecimal(num2);
        BigDecimal result = dividend.divide(divisor,  4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100));
        System.out.printf("百分比1: "+ result );
        result = result.setScale(2,  BigDecimal.ROUND_HALF_UP);
        return result;
    }

//    public static void main(String[] args) {
//        Integer numerator = 10; // 分子
//        Integer denominator = 30; // 分母
//
//        // 调用方法计算百分比，并返回Long类型结果
//        BigDecimal percentage = calculatePercentage(numerator, denominator);
//
//        // 打印结果（注意：这里打印的是模拟了两位小数的Long值）
//        System.out.printf("百分比: "+ percentage );
//    }
}
