package com.yanzuoguang.redis;

import com.yanzuoguang.util.helper.DateHelper;

import java.util.Date;

/**
 * 添加途比达任务
 *
 * @author 颜佐光
 */
public class PlanInfo<T> {

    public static final long HEART_MAX = 10 * 1000;

    /**
     * 编号,判断时间是否满足
     */
    private volatile long id;

    /**
     * 获取当前时间是否满足,这里记录上次执行时间(用于时间隔天执行对比)
     */
    private volatile long time;
    /**
     * 心跳时间
     */
    private volatile long heart;
    /**
     * 缓存数据
     */
    private volatile T data;

    /**
     * 途比达任务参数
     */
    public PlanInfo() {
        this.id = System.currentTimeMillis();
        this.time = 0;
    }

    /**
     * 任务信息
     *
     * @param id   任务Id
     * @param data 数据
     */
    public PlanInfo(long id, T data) {
        this.id = id;
        this.data = data;
    }

    /**
     * 任务Id是否相等
     *
     * @param newId 新Id
     * @return 是否能够满足新Id
     */
    public boolean isId(long newId) {
        return newId > this.getId() || newId == this.getId();
    }

    /**
     * 是否执行
     *
     * @param newId 新Id
     * @param times 时间差
     * @return 是否能够运行
     */
    public boolean isActive(long newId, long times) {
        if (newId > this.getId()) {
            return true;
        } else {
            long now = System.currentTimeMillis();
            if (now - this.heart < HEART_MAX) {
                return false;
            }
            return newId == this.getId() && now - this.getTime() >= times;
        }
    }

    /**
     * 心跳执行函数
     */
    public void heart() {
        this.heart = System.currentTimeMillis();
    }

    /**
     * 心跳执行完成
     */
    public void heartFinish() {
        this.heart = 0;
    }

    /**
     * 间隔N天后第N个小时执行
     *
     * @param day  N天
     * @param hour N小时
     * @return 下次执行间隔时间
     */
    public int getNextDayHourMillSecond(int day, int hour) {
        if (this.getTime() == 0) {
            return 0;
        }
        // 上次执行时间
        Date prevTime = new Date(this.getTime());
        String prevToday = DateHelper.getToday(prevTime);
        // 通过MQ设置明天凌晨2点开始计算
        Date nextDay = DateHelper.addDay(DateHelper.getDateTime(prevToday), day);
        Date nextDayHour = DateHelper.addHour(nextDay, hour);
        // 下次执行时间
        long dedTime = Math.max(0, nextDayHour.getTime() - this.getTime());
        return (int) dedTime;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public long getTime() {
        return time;
    }

    public void setTime(long time) {
        this.time = time;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}