package io.wdd.rpc.scheduler.service;

import io.wdd.rpc.scheduler.beans.OctopusQuartzJob;
import io.wdd.rpc.scheduler.beans.ScriptSchedulerVO;
import org.quartz.JobDetail;
import org.quartz.Trigger;
import org.springframework.scheduling.quartz.QuartzJobBean;

import java.util.HashMap;
import java.util.List;
import java.util.Map;


public interface QuartzSchedulerService {


    boolean addMission(OctopusQuartzJob quartzJob);

    /**
     * 增加一个任务job, 重复特定的次数
     *
     * @param jobClass          任务job实现类
     * @param jobName           任务job名称（保证唯一性）
     * @param jobGroupName      任务job组名
     * @param jobRunTimePinch   任务时间间隔（秒）
     * @param jobRunRepeatTimes 任务运行次数（若<0，则不限次数）
     * @param jobData           任务参数
     */
    void addMission(Class<? extends QuartzJobBean> jobClass, String jobName, String jobGroupName, int jobRunTimePinch, int jobRunRepeatTimes, Map jobData);

    /**
     * 增加一个任务job
     *
     * @param jobClass          任务job实现类
     * @param jobName           任务job名称（保证唯一性）
     * @param jobGroupName      任务job组名
     * @param startTime
     * @param cronJobExpression 任务时间表达式
     * @param jobData           任务参数
     * @return
     */
    JobDetail addMission(Class<? extends QuartzJobBean> jobClass, String jobName, String jobGroupName, int startTime, String cronJobExpression, Map jobData);

    /**
     * 增加一个任务job
     *
     * @param jobClass          任务job实现类
     * @param jobName           任务job名称（保证唯一性）
     * @param jobGroupName      任务job组名
     * @param cronJobExpression 任务时间表达式
     * @param jobData           任务参数
     * @return
     */
    JobDetail addMission(
            Class<? extends QuartzJobBean> jobClass,
            String jobName,
            String jobGroupName,
            String jobDescription,
            String cronJobExpression,
            Map jobData
    );

    /**
     * 修改一个任务job
     *
     * @param jobName      任务名称
     * @param jobGroupName 任务组名
     * @param jobTime      cron时间表达式
     */
    void updateMission(String jobName, String jobGroupName, String jobTime);


    /**
     * 删除一个任务job
     *
     * @param jobName
     * @param jobGroupName
     * @return
     */
    boolean deleteMission(String jobName, String jobGroupName);

    /**
     * 暂停一个任务job
     *
     * @param jobName
     * @param jobGroupName
     */
    void pauseMission(String jobName, String jobGroupName);

    /**
     * 恢复一个任务job
     *
     * @param jobName
     * @param jobGroupName
     */
    void resumeMission(String jobName, String jobGroupName);

    /**
     * 立即执行一个任务job
     *
     * @param jobName
     * @param jobGroupName
     */
    void runAJobNow(String jobName, String jobGroupName);

    /**
     * 获取所有任务job
     *
     * @return
     */
    List<Map<String, Object>> queryAllMission();

    /**
     * 获取正在运行的任务job
     *
     * @return
     */
    List<Map<String, Object>> queryRunMission();


    /**
     * 获取所有的触发器
     */
    List<Trigger> queryAllTrigger();


    /**
     * 页面定时任务部分
     * 应该只有脚本功能才可以定时，目前一阶段的功能
     *
     * @return
     */
    HashMap<String, String> createScriptScheduledMission(ScriptSchedulerVO scriptSchedulerVO);

    /**
     * 查询所有定时脚本任务
     *
     * @return
     */
    List<JobDetail> queryAllScriptScheduleMission();


    boolean deleteScriptScheduleMission(String schedulerUuid);


    JobDetail modifyScriptScheduleMission(ScriptSchedulerVO scriptSchedulerVO);

}
