package com.tofly.common.constant;

import cn.hutool.core.date.DateUtil;
import com.tofly.common.core.util.StringUtil;
import com.tofly.scada.common.FlowConstant;

import javax.xml.crypto.Data;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

public class CalendarHelper {
    /**
     * 字符串转日期
     *
     * @param dateStr，日期字符串
     * @param simpleDateFormat，转换的格式
     * @return
     * @throws Exception
     */

    public static Date ConvertStrToDate(String dateStr,String simpleDateFormat) {
        try {
        if (!StringUtil.isNotEmpty(simpleDateFormat)) {
            simpleDateFormat = "yyyyMMdd";

        }
        SimpleDateFormat sdf = new SimpleDateFormat(simpleDateFormat);
        //将传入的时间解析成Date类型,相当于格式化
        return sdf.parse(dateStr);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 传入两个时间范围，返回这两个时间范围内的所有日期,按照天
     *
     * @param beginTime
     * @param endTime
     * @return
     * @throws Exception
     */
    public static List<String> getDayBetweenDate(String beginTime, String endTime,String simpleDateFormat)
    {
        //创建一个放所有日期的集合
        List<String> dates = new ArrayList();
        try {
            //创建时间解析对象规定解析格式

            if (!StringUtil.isNotEmpty(simpleDateFormat)) {
                simpleDateFormat = "yyyyMMdd";

            }
            SimpleDateFormat sdf = new SimpleDateFormat(simpleDateFormat);
            //将传入的时间解析成Date类型,相当于格式化
            Date dBegin = sdf.parse(beginTime);
            Date dEnd = sdf.parse(endTime);

            //将格式化后的第一天添加进集合
            dates.add(sdf.format(dBegin));

            //使用本地的时区和区域获取日历
            Calendar calBegin = Calendar.getInstance();

            //传入起始时间将此日历设置为起始日历
            calBegin.setTime(dBegin);

            //判断结束日期前一天是否在起始日历的日期之后
            while (dEnd.after(calBegin.getTime())) {

                //根据日历的规则:月份中的每一天，为起始日历加一天
                calBegin.add(Calendar.DAY_OF_MONTH, 1);

                //得到的每一天就添加进集合
                dates.add(sdf.format(calBegin.getTime()));
                //如果当前的起始日历超过结束日期后,就结束循环
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return dates;
    }


    /**
     *传入两个时间范围，返回这两个时间范围内的所有日期,按照小时
     *
     * @param beginTime
     * @param endTime
     * @return
     * @throws Exception
     */
    public static List<String> getHoursBetweenDate(String beginTime, String endTime,String simpleDateFormat)
    {
        //创建一个放所有日期的集合
        List<String> dates = new ArrayList();
        try {
            //创建时间解析对象规定解析格式

            if (!StringUtil.isNotEmpty(simpleDateFormat)) {
                simpleDateFormat = "yyyyMMdd";

            }
            SimpleDateFormat sdf = new SimpleDateFormat(simpleDateFormat);
            //将传入的时间解析成Date类型,相当于格式化
            Date dBegin = sdf.parse(beginTime);
            Date dEnd = sdf.parse(endTime);

            //将格式化后的第一天添加进集合
            dates.add(sdf.format(dBegin));

            //使用本地的时区和区域获取日历
            Calendar calBegin = Calendar.getInstance();

            //传入起始时间将此日历设置为起始日历
            calBegin.setTime(dBegin);

            //判断结束日期前一天是否在起始日历的日期之后
            while (dEnd.after(calBegin.getTime())) {

                //根据日历的规则:月份中的每一天，为起始日历加一天
                calBegin.add(Calendar.HOUR_OF_DAY, 1);

                //得到的每一天就添加进集合
                dates.add(sdf.format(calBegin.getTime()));
                //如果当前的起始日历超过结束日期后,就结束循环
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return dates;
    }

    /**
     *传入两个时间范围，返回这两个时间范围内的所有日期,按照分钟
     *
     * @param beginTime
     * @param endTime
     * @return
     * @throws Exception
     */
    public static List<String> getMinutesBetweenDate(String beginTime, String endTime,Integer minutes,String simpleDateFormat)
    {
        //创建一个放所有日期的集合
        List<String> dates = new ArrayList();
        try {
            //创建时间解析对象规定解析格式

            if (!StringUtil.isNotEmpty(simpleDateFormat)) {
                simpleDateFormat = "yyyyMMdd HH";

            }
            SimpleDateFormat sdf = new SimpleDateFormat(simpleDateFormat);
            //将传入的时间解析成Date类型,相当于格式化
            Date dBegin = sdf.parse(beginTime);
            Date dEnd = sdf.parse(endTime);

            //将格式化后的第一天添加进集合
            dates.add(sdf.format(dBegin));

            //使用本地的时区和区域获取日历
            Calendar calBegin = Calendar.getInstance();

            //传入起始时间将此日历设置为起始日历
            calBegin.setTime(dBegin);

            //判断结束日期前一天是否在起始日历的日期之后
            while (dEnd.after(calBegin.getTime())) {

                //根据日历的规则:月份中的每一天，为起始日历加一天
                calBegin.add(Calendar.MINUTE, minutes);

                //得到的每一天就添加进集合
                dates.add(sdf.format(calBegin.getTime()));
                //如果当前的起始日历超过结束日期后,就结束循环
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return dates;
    }

    /**
     * 传入两个时间范围，返回这两个时间范围内的所有日期,按照月
     *
     * @param startTime
     * @param endTime
     * @@param simpleDateFormat
     * @return：list
     */
    public static List<String> getMonthBetweenDate(String startTime, String endTime,String simpleDateFormat) {
       if(!StringUtil.isNotEmpty(simpleDateFormat)){
           simpleDateFormat="yyyyMM";

       }
        SimpleDateFormat sdf = new SimpleDateFormat(simpleDateFormat);
        // 声明保存日期集合
        List<String> list = new ArrayList<>();
        try {
            // 转化成日期类型
            Date startDate = sdf.parse(startTime);
            Date endDate = sdf.parse(endTime);

            //用Calendar 进行日期比较判断
            Calendar calendar = Calendar.getInstance();
            while (startDate.getTime() <= endDate.getTime()) {

                // 把日期添加到集合
                list.add(sdf.format(startDate));

                // 设置日期
                calendar.setTime(startDate);

                //把月数增加 1
                calendar.add(Calendar.MONTH, 1);

                // 获取增加后的日期
                startDate = calendar.getTime();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return list;
    }



    /**
     * 传入两个时间范围，返回这两个时间范围内的所有日期,按照年
     *
     * @param startTime
     * @param endTime
     * @return：list
     */
    public static List<String> getYearBetweenDate(String startTime, String endTime) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
        // 声明保存日期集合
        List<String> list = new ArrayList<>();
        try {
            // 转化成日期类型
            Date startDate = sdf.parse(startTime);
            Date endDate = sdf.parse(endTime);

            //用Calendar 进行日期比较判断
            Calendar calendar = Calendar.getInstance();
            while (startDate.getTime() <= endDate.getTime()) {

                // 把日期添加到集合
                list.add(sdf.format(startDate));

                // 设置日期
                calendar.setTime(startDate);

                //把年数增加 1
                calendar.add(Calendar.YEAR, 1);

                // 获取增加后的日期
                startDate = calendar.getTime();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return list;
    }


    public static String getYearAndMonth(Date time, Integer num, String formatter){//SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//Date date = format.parse(time);

        Calendar calendar=Calendar.getInstance();

        calendar.setTime(time);

        calendar.add(Calendar.MONTH, num);

        Date newTime=calendar.getTime();
        SimpleDateFormat sdf = new SimpleDateFormat(formatter);
        String formatDate = sdf.format(newTime);
        return formatDate;

    }
    public  static String getFormatDate(Date date,String simpleDateFormat){
        DateFormat dateFormat = new SimpleDateFormat(simpleDateFormat);
        String str = dateFormat.format(date);
       return str;
    }


}
