package com.storlead.sales.service;


import com.storlead.sales.pojo.vo.dispatch.TaskInfoVO;
import com.storlead.framework.common.result.Result;
import org.quartz.SchedulerException;

import javax.validation.constraints.NotNull;

/**
 * 定时任务管理接口
 *
 * @author YPZ
 * @date 2022-5-19
 */
public interface SysTaskService {

    /**
     * 分页查询
     *
     * @param pageIndex 页码
     * @param pageSize  页面大小
     * @return 任务列表
     * @author YPZ
     * @date 2022-5-19
     */
    Result<?> list(int pageIndex, int pageSize);

    /**
     * 添加定时任务
     *
     * @param taskInfoVo 定时任务实体
     *                   jobName 任务名
     *                   jobGroup 任务组名
     *                   cronExpression CRON 表达式
     *                   jobDescription 任务描述
     * @author YPZ
     * @date 2022-5-19
     */
    void addJob(TaskInfoVO taskInfoVo);

    /**
     * 添加 定时任务
     *
     * @param jobName        任务名
     * @param jobGroup       任务组名
     * @param cronExpression CRON 表达式
     * @param jobDescription 任务描述
     * @author YPZ
     * @date 2022-5-19
     */
    void addJob(@NotNull String jobName, @NotNull String jobGroup, @NotNull String cronExpression, @NotNull String jobDescription);


    /**
     * 修改定时任务
     *
     * @param taskInfoVo 定时任务实体
     *                   jobName 任务名
     *                   jobGroup 任务组名
     *                   cronExpression CRON 表达式
     *                   jobDescription 任务描述
     * @author YPZ
     * @date 2022-5-19
     */
    void editJob(TaskInfoVO taskInfoVo);

    /**
     * 修改定时任务
     *
     * @param jobName        任务名
     * @param jobGroup       任务组名
     * @param cronExpression CRON 表达式
     * @param jobDescription 任务描述
     * @author YPZ
     * @date 2022-5-19
     */
    void editJob(@NotNull String jobName, @NotNull String jobGroup, String cronExpression, String jobDescription);

    /**
     * 删除定时任务
     *
     * @param taskInfoVo 定时任务实体
     *                   jobName 任务名
     *                   jobGroup 任务组名
     *                   cronExpression CRON 表达式
     *                   jobDescription 任务描述
     * @author YPZ
     * @date 2022-5-19
     */
    void deleteJob(TaskInfoVO taskInfoVo);

    /**
     * 删除定时任务
     *
     * @param jobName  任务名
     * @param jobGroup 任务组名
     * @author YPZ
     * @date 2022-5-19
     */
    void deleteJob(@NotNull String jobName, @NotNull String jobGroup);

    /**
     * 暂停定时任务
     *
     * @param taskInfoVo 定时任务实体
     *                   jobName 任务名
     *                   jobGroup 任务组名
     * @author YPZ
     * @date 2022-5-19
     */
    void pauseJob(TaskInfoVO taskInfoVo);

    /**
     * 暂停定时任务
     *
     * @param jobName  任务名
     * @param jobGroup 任务组名
     * @author YPZ
     * @date 2022-5-19
     */
    void pauseJob(@NotNull String jobName, @NotNull String jobGroup);


    /**
     * 重启定时任务
     *
     * @param taskInfoVo 定时任务实体
     *                   jobName 任务名
     *                   jobGroup 任务组名
     * @author YPZ
     * @date 2022-5-19
     */
    void resumeJob(TaskInfoVO taskInfoVo);

    /**
     * 重启定时任务
     *
     * @param jobName  任务名
     * @param jobGroup 任务组名
     * @author YPZ
     * @date 2022-5-19
     */
    void resumeJob(@NotNull String jobName, @NotNull String jobGroup);


    /**
     * 立即执行任务
     *
     * @param taskInfoVo 定时任务实体
     *                   jobName 任务名
     *                   jobGroup 任务组名
     * @author YPZ
     * @date 2022-5-19
     */
    void triggerJob(TaskInfoVO taskInfoVo);

    /**
     * 立即执行任务
     *
     * @param jobName  任务名
     * @param jobGroup 任务组名
     * @author YPZ
     * @date 2022-5-19
     */
    void triggerJob(@NotNull String jobName, @NotNull String jobGroup);


    /**
     * 验证任务是否存在
     *
     * @param jobName  任务名
     * @param jobGroup 任务组名
     * @return true if its exists otherwise false
     * @throws SchedulerException schedulerException
     * @author YPZ
     * @date 2022-5-19
     */
    boolean checkExists(@NotNull String jobName, @NotNull String jobGroup) throws SchedulerException;

}
