package com.njcn.harmonic.utils;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.njcn.common.pojo.exception.BusinessException;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Date;

/**
 * 数据公共工具类
 *
 * @author qijian
 * @version 1.0.0
 * @createTime 2022/10/14 - 10:07
 */

public class PublicDataUtils {
    /**
     * 功能：下划线命名转驼峰命名
     * 将下划线替换为空格,将字符串根据空格分割成数组,再将每个单词首字母大写
     * @param s
     * @return
     */
    public static String underCamel(String s)
    {
        String separator = "_";
        String under="";
        s = s.toLowerCase().replace(separator, " ");
        String sarr[]=s.split(" ");
        for(int i=0;i<sarr.length;i++)
        {
            String w=sarr[i].substring(0,1).toUpperCase()+sarr[i].substring(1);
            under +=w;
        }
        return under;
    }

    /**
     * 计算指定月份的第一天 (格式：yyyy-MM-dd)
     * @param monthStr 月份字符串，格式为 yyyy-MM
     * @return 月份第一天的日期字符串
     */
    public static String calculateMonthStart(String monthStr) {
        if (StrUtil.isBlank(monthStr)) {
            return null;
        }
        try {
            Date date = DateUtil.parse(monthStr, "yyyy-MM");
            Date firstDayOfMonth = DateUtil.beginOfMonth(date);
            return DateUtil.format(firstDayOfMonth, "yyyy-MM-dd");
        } catch (Exception e) {
            throw new BusinessException("时间格式不正确，请使用 yyyy-MM 格式");
        }
    }

    /**
     * 计算指定月份的最后一天 (格式：yyyy-MM-dd)
     * @param monthStr 月份字符串，格式为 yyyy-MM
     * @return 月份最后一天的日期字符串
     */
    public static String calculateMonthEnd(String monthStr) {
        if (StrUtil.isBlank(monthStr)) {
            return null;
        }
        try {
            Date date = DateUtil.parse(monthStr, "yyyy-MM");
            Date lastDayOfMonth = DateUtil.endOfMonth(date);
            return DateUtil.format(lastDayOfMonth, "yyyy-MM-dd");
        } catch (Exception e) {
            throw new BusinessException("时间格式不正确，请使用 yyyy-MM 格式");
        }
    }

    /**
     * 根据传入的月份字符串获取时间范围
     * 如果传入的月份是当前月份，返回该月1号到昨天
     * 如果传入的月份不是当前月份，返回该月的第一天和最后一天
     *
     * @param timeStr 月份字符串，格式：yyyy-MM
     * @return 包含 startTime 和 endTime 的数组，格式：yyyy-MM-dd
     */
    /**
     * 根据传入的月份字符串获取时间范围
     * 如果传入的月份是当前月份，返回该月 1 号到昨天
     * 如果传入的月份不是当前月份，返回该月的第一天和最后一天
     *
     * @param timeStr 月份字符串，格式：yyyy-MM
     * @return 包含 startTime 和 endTime 的数组，格式：yyyy-MM-dd
     */
    public static String[] calculateTimeRange(String timeStr) {
        LocalDate now = LocalDate.now();
        LocalDate inputMonth;

        try {
            // 解析传入的月份
            inputMonth = LocalDate.parse(timeStr + "-01", DateTimeFormatter.ISO_LOCAL_DATE);
        } catch (Exception e) {
            throw new BusinessException("时间格式不正确，请使用 yyyy-MM 格式");
        }

        // 判断是否是当前月份
        boolean isCurrentMonth = inputMonth.getYear() == now.getYear() &&
                inputMonth.getMonthValue() == now.getMonthValue();

        String startTime;
        String endTime;

        startTime = inputMonth.withDayOfMonth(1).format(DateTimeFormatter.ISO_LOCAL_DATE);
        if (isCurrentMonth) {
            // 如果今天是 1 号，则结束时间也为 1 号，避免时间范围无效
            endTime = now.minusDays(1).format(DateTimeFormatter.ISO_LOCAL_DATE);
            // 确保结束时间不小于开始时间
            if (LocalDate.parse(endTime).isBefore(LocalDate.parse(startTime))) {
                endTime = startTime;
            }
        } else {
            // 如果不是当前月份，开始时间是该月 1 号，结束时间是该月最后一天
            endTime = inputMonth.withDayOfMonth(inputMonth.lengthOfMonth()).format(DateTimeFormatter.ISO_LOCAL_DATE);
        }

        return new String[]{startTime, endTime};
    }

}
