package jnpf.util.attendance;

import jnpf.util.DateUtil;
import org.springframework.stereotype.Component;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.Month;
import java.time.Period;
import java.time.ZoneId;
import java.time.temporal.TemporalAdjusters;
import java.util.Calendar;
import java.util.Date;

/**
 * @author panpan
 */
@Component
public class ExpiresTimeUtil {

    /**
     * 计算过期时间
     * @param lifespanType 生效类型 0.永久有效 1.固定天数 2.指定日期
     * @param fixedDay 固定天数
     * @param specifyDay 指定日期 格式MM-dd
     * @return  过期时间
     */
    public Date getExpiresTime(Integer lifespanType, Integer fixedDay, String specifyDay){
        //永久有效 1-固定天数 （当前时间加上设置的天数） 2-指定日期 拼接今年的年判断有无过去，过去后取下一年，没有过去取今年
        if (lifespanType == 0){
            return null;
        }
        SimpleDateFormat yyyy = new SimpleDateFormat("yyyy" );
        SimpleDateFormat yMd = new SimpleDateFormat("yyyy-MM-dd" );
        SimpleDateFormat yMdHms = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss" );
        SimpleDateFormat hms = new SimpleDateFormat("HH:mm:ss" );
        if (lifespanType == 1){
            return DateUtil.dateAddDays(new Date(), fixedDay);
        }
        if (lifespanType == 2){
            Date time = new Date();
            String year = yyyy.format(time);
            String expiresTime = year + "-" + specifyDay  + " " + hms.format(time);
            System.out.println("拼接时间： "+expiresTime);
            String today = yMd.format(time);
            System.out.println("今天： "+today);
            try {
                if (yMd.parse(expiresTime).getTime() <= yMd.parse(today).getTime()){
                    System.out.println("已过期");
                    // 获取下一年的指定时间
                    Calendar c = Calendar.getInstance();
                    c.setTime(yMdHms.parse(expiresTime));
                    c.set(Calendar.YEAR, c.get(Calendar.YEAR) + 1);
                    return c.getTime();
                } else {
                    return yMdHms.parse(expiresTime);
                }
            } catch (ParseException e) {
                throw new RuntimeException(e);
            }

        }
        return DateUtil.dateAddDays(new Date(), 365);
    }



    /**
     * 计算员工从入职日期到现在的司龄返回月数
     *
     * @param startDate 员工入职日期
     * @return  司龄（单位：月）
     */
    public Integer calculateSeniorityMonth(Date startDate) {
        // 参数校验
        if (startDate == null ) {
            return 1;
        }
        // 入职日期
        LocalDate startLocalDate = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
        // 当前日期
        LocalDate currentDate = LocalDate.now();
        // 确保开始日期不晚于当前日期
        if (startLocalDate.isAfter(currentDate)) {
            return 1;
        }
        Period period = Period.between(startLocalDate, currentDate);
        int years = period.getYears();
        int months = period.getMonths();
        int days = period.getDays();
        // 返回司龄（单位：月） 哪怕是一天，也算一个月
        return years * 12 + months + (0 != days ? 1 : 0);
    }

    // 获取指定日期的日
    /**
     * 检查指定日期是否在当前日期的月份内
     * @param startDate  指定日期
     * @param currentDate 当前日期
     * @return true  在当前日期的月份内 false 不在当前日期的月份内
     */
    public boolean checkMonthDay(Date startDate,LocalDate currentDate) {
        // 当前日期
        int monthValue = currentDate.getMonthValue();
        int day = currentDate.getDayOfMonth();
        // 当前月份 最后一天的日
        int monthLastDay = currentDate.with(TemporalAdjusters.lastDayOfMonth()).getDayOfMonth();
        // 返回入参对应的月份
        LocalDate startLocalDate = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
        int checkMonth = startLocalDate.getMonthValue();
        int checkDay = startLocalDate.getDayOfMonth();
        return checkMonth == monthValue && (checkDay == day || (day == monthLastDay && checkDay >= day));
    }


    /**
     * 检查指定日期是否在当前日期的月份内
     * @param startDate  指定日期
     * @param monthDayStr  格式MM-dd
     * @return true  在当前日期的月份内 false 不在当前日期的月份内
     */
    public boolean checkMonthDayStr(Date startDate,String monthDayStr) {
        String[] monthDay = monthDayStr.split("-");
        int month = Integer.parseInt(monthDay[0]);
        int day = Integer.parseInt(monthDay[1]);
        // 获取今年对应月份的最后一天日
        int monthLastDay =  LocalDate.now().withMonth(month).with(TemporalAdjusters.lastDayOfMonth()).getDayOfMonth();
        // 当前月份 最后一天的日
        // 返回入参对应的月份
        LocalDate startLocalDate = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
        int checkMonth = startLocalDate.getMonthValue();
        int checkDay = startLocalDate.getDayOfMonth();
        return checkMonth == month && (checkDay == day || (day >= monthLastDay && checkDay >= day));
    }
}
