package com.jeequan.jeepay.core.utils;

import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.SystemClock;
import com.jeequan.jeepay.core.exception.BizException;
import org.apache.commons.lang3.StringUtils;

import java.util.Date;

/*
* 时间工具类
*
* @author terrfly
*
* @date 2021/6/8 16:58
*/
public class DateKit {

	/** 获取参数时间当天的开始时间  **/
	public static Date getBegin(Date date){

		if(date == null) {
            return null;
        }
		return DateUtil.beginOfDay(date).toJdkDate();
	}

	/** 获取参数时间当天的结束时间 **/
	public static Date getEnd(Date date){
		if(date == null) {
            return null;
        }
		return DateUtil.endOfDay(date).toJdkDate();
	}


	/**
	 * 获取自定义查询时间
	 * today  -- 今天
	 * yesterday  -- 昨天
	 * near2now_7  -- 近xx天， 到今天
	 * near2yesterday_30   -- 近xx天， 到昨天
	 * customDate_2020-01-01_N  -- 自定义日期格式  N表示为空， 占位使用, 自动拼接 00:00:00 和 23:59:59
	 * customDateTime_2020-01-01 23:00:00_2020-01-01 23:00:00 -- 自定义日期时间格式
	 *
	 * @return
	 */
	public static Date[] getQueryDateRange(String queryParamVal){

		//查询全部
		if(StringUtils.isEmpty(queryParamVal)){
			return new Date[]{null, null};
		}

		Date nowDateTime = new Date();  //当前时间

		if("today".equals(queryParamVal)){ //今天
			return new Date[]{getBegin(nowDateTime), getEnd(nowDateTime)};

		}else if("toweek".equals(queryParamVal)){  //本周
			return new Date[]{getBegin(DateUtil.beginOfWeek(nowDateTime)), getEnd(DateUtil.endOfWeek(nowDateTime))};

		}else if("yesterday".equals(queryParamVal)){  //昨天

			Date yesterdayDateTime = DateUtil.offsetDay(nowDateTime, -1).toJdkDate(); //昨天
			return new Date[]{getBegin(yesterdayDateTime), getEnd(yesterdayDateTime)};

		}else if("currMonth".equals(queryParamVal)){  // 本月

			return new Date[]{ DateUtil.beginOfMonth(nowDateTime), DateUtil.endOfMonth(nowDateTime) };

		}else if("prevMonth".equals(queryParamVal)){  // 上月

			return new Date[]{ DateUtil.beginOfMonth(DateUtil.lastMonth()), DateUtil.endOfMonth(DateUtil.lastMonth()) };

		}

		//根据 _ 分割
		String[] valArray = queryParamVal.split("_");

		String dateType = valArray[0];  //时间类型

		if("near2now".equals(dateType)){  //近xx天， xx天之前 ~ 当前时间

			if(valArray.length != 2){ //参数有误
				throw new BizException("查询时间参数有误");
			}
			String dateVal = valArray[1];  //搜索时间值

			Integer offsetDay = 1 - Integer.parseInt(dateVal);  //获取时间偏移量
			Date offsetDayDate = DateUtil.offsetDay(nowDateTime, offsetDay).toJdkDate();
			return new Date[]{getBegin(offsetDayDate), getEnd(nowDateTime)};

		}else if("near2yesterday".equals(dateType)){  //近xx天， xx天之前 ~ 昨天

			if(valArray.length != 2){ //参数有误
				throw new BizException("查询时间参数有误");
			}
			String dateVal = valArray[1];  //搜索时间值

			Date yesterdayDateTime = DateUtil.offsetDay(nowDateTime, -1).toJdkDate(); //昨天

			Integer offsetDay = 1 - Integer.parseInt(dateVal);  //获取时间偏移量
			Date offsetDayDate = DateUtil.offsetDay(yesterdayDateTime, offsetDay).toJdkDate();
			return new Date[]{getBegin(offsetDayDate), getEnd(yesterdayDateTime)};

		}else if("customDate".equals(dateType) || "customDateTime".equals(dateType)){ //自定义格式

			if(valArray.length != 3){ //参数有误
				throw new BizException("查询时间参数有误");
			}

			String timeStr1 = "N".equalsIgnoreCase(valArray[1]) ? null : valArray[1] ;  //开始时间，
			String timeStr2 = "N".equalsIgnoreCase(valArray[2]) ? null : valArray[2];  //结束时间， N表示为空， 占位使用

			Date time1 = null;
			Date time2 = null;

			if(StringUtils.isNotEmpty(timeStr1)){
				time1 = DateUtil.parseDateTime("customDate".equals(dateType) ? (timeStr1 + " 00:00:00" ) : timeStr1);
			}
			if(StringUtils.isNotEmpty(timeStr2)){
				time2 = DateUtil.parse( (  "customDate".equals(dateType) ? (timeStr2 + " 23:59:59.999" ) : timeStr2  + ".999"  ) , DatePattern.NORM_DATETIME_MS_FORMAT);
			}
			return new Date[]{time1, time2};

		}else{
			throw new BizException("查询时间参数有误");
		}
	}

	/** 公共函数，获取当前时间。  **/
	public static Long currentTimeMillis(){
//		System.currentTimeMillis(); // fortify 检测属于安全漏洞
		return SystemClock.now();
	}

}
