package com.bohuikeji.frame.module.admin.task;

import lombok.Data;

import java.util.HashMap;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;

/**
 * 任务控制器
 * @author 孙劲辉
 * @date 2022-01-19
 */
@Data
public class TaskDelayed implements Delayed {
    /**
     * 要执行的任务
     */
    private Task task;

    /**
     * 延时时间(ms)
     *
     */
    private long delayTime;

    /**
     * 任务参数
     */
    private HashMap<String,Object> params=new HashMap<>();

    /**
     * 构造函数——初始化任务控制器
     * @param task 任务体
     * @param delayTime 延时时间
     */
    public TaskDelayed(Task task,long delayTime) {
        this.task = task;
        this.delayTime = delayTime+System.currentTimeMillis();
    }

    /**
     * 添加运行任务参数
     * @param key 参数key
     * @param value 参数value
     * @return 返回任务控制器
     */
    public TaskDelayed addParam(String key,Object value){
        params.put(key,value);
        return this;
    }

    /**
     * 添加运行任务参数
     * @param params 参数Map集合
     * @return 返回
     */
    public TaskDelayed addParam(HashMap<String,Object> params){
        this.params=params;
        return this;
    }

    /**
     * 删除参数
     * @param key 参数key
     * @return 返回任务控制器
     */
    public TaskDelayed delParam(String key){
        params.remove(key);
        return this;
    }

    @Override
    public long getDelay(TimeUnit unit) {
        return unit.convert(delayTime,TimeUnit.NANOSECONDS) - unit.convert(System.currentTimeMillis(),TimeUnit.NANOSECONDS);
    }

    @Override
    public int compareTo(Delayed o) {
        return (int)(this.delayTime - ((TaskDelayed) o).getDelayTime());
    }
}
