package com.yice.common.quartz.controller;

import com.yice.common.core.constant.ErrorCodeEnum;
import com.yice.common.core.object.ResponseResult;
import com.yice.common.quartz.object.QuartzJobData;
import com.yice.common.quartz.object.QuartzJobParam;
import com.yice.common.quartz.service.QuartzJobService;
import lombok.extern.slf4j.Slf4j;
import org.quartz.SchedulerException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * Quartz Job 基本操作接口。
 *
 * @author linking
 * @date 2023-04-13
 */
@Slf4j
@RestController
@RequestMapping("/admin/system/job")
public class QuartzJobController {

    @Autowired
    private QuartzJobService jobService;

    /**
     * 添加Job任务对象。
     *
     * @param jobParam Job的参数对象。
     * @return 添加结果应答对象。
     */
    @PostMapping("/add")
    public ResponseResult<Void> add(@RequestBody QuartzJobParam jobParam) {
        try {
            jobService.saveNew(jobParam);
        } catch (Exception e) {
            return ResponseResult.error(ErrorCodeEnum.SERVER_INTERNAL_ERROR, e.getMessage());
        }
        return ResponseResult.success();
    }

    /**
     * 删除Job任务对象。
     *
     * @param jobName  Job的名字。
     * @param jobGroup Job的组名。
     * @return 删除结果应答对象。
     * @throws SchedulerException 删除异常。
     */
    @PostMapping("/delete")
    public ResponseResult<Void> delete(
            @RequestParam String jobName, @RequestParam String jobGroup) throws SchedulerException {
        jobService.remove(jobName, jobGroup);
        return ResponseResult.success();
    }

    /**
     * 获取当前Scheduler的所有Job数据列表。
     *
     * @return 当前Scheduler的所有Job数据列表。
     */
    @GetMapping("/listJobs")
    public ResponseResult<List<QuartzJobData>> getAllJobList() throws SchedulerException {
        List<QuartzJobData> jobDataList = jobService.getAllJobDataList();
        return ResponseResult.success(jobDataList);
    }

    /**
     * 触发指定的Job。
     *
     * @param jobName  Job的名字。
     * @param jobGroup Job的组名。
     * @return 操作结果应答对象。
     * @throws SchedulerException 操作异常。
     */
    @PostMapping(value = "/trigger")
    public ResponseResult<Void> trigger(
            @RequestParam String jobName, @RequestParam String jobGroup) throws SchedulerException {
        jobService.trigger(jobName, jobGroup);
        return ResponseResult.success();
    }

    /**
     * 暂停指定的Job。
     *
     * @param jobName  Job的名字。
     * @param jobGroup Job的组名。
     * @return 操作结果应答对象。
     * @throws SchedulerException 操作异常。
     */
    @PostMapping(value = "/pause")
    public ResponseResult<Void> pause(
            @RequestParam String jobName, @RequestParam String jobGroup) throws SchedulerException {
        jobService.pause(jobName, jobGroup);
        return ResponseResult.success();
    }

    /**
     * 恢复暂停指定的Job。
     *
     * @param jobName  Job的名字。
     * @param jobGroup Job的组名。
     * @return 操作结果应答对象。
     * @throws SchedulerException 操作异常。
     */
    @PostMapping(value = "/resume")
    public ResponseResult<Void> resume(
            @RequestParam String jobName, @RequestParam String jobGroup) throws SchedulerException {
        jobService.resume(jobName, jobGroup);
        return ResponseResult.success();
    }

    /**
     * 重新设置指定Job的调度时间。
     *
     * @param jobName        Job的名字。
     * @param jobGroup       Job的组名。
     * @param cronExpression 新的Cron表达式。
     * @return 操作结果应答对象。
     * @throws SchedulerException 操作异常。
     */
    @PostMapping(value = "/reschedule")
    public ResponseResult<Void> reschedule(
            @RequestParam String jobName,
            @RequestParam String jobGroup,
            @RequestParam String cronExpression) throws SchedulerException {
        jobService.reschedule(jobName, jobGroup, cronExpression);
        return ResponseResult.success();
    }
}
