package com.nanjing.water.host.controller.base;

import com.nanjing.water.common.ExecutedResult;
import com.nanjing.water.common.PagerResult;
import com.nanjing.water.entity.request.quartztaskinfo.ReqCreateQuartzTaskInfo;
import com.nanjing.water.entity.request.quartztaskinfo.ReqModifyQuartzTaskInfo;
import com.nanjing.water.entity.request.quartztaskinfo.ReqRunTaskRightNow;
import com.nanjing.water.entity.search.SearchQuartzTaskInfo;
import com.nanjing.water.entity.search.SearchQuartzTaskRecord;
import com.nanjing.water.host.api.NonLogin;
import com.nanjing.water.repository.vo.QuartzTaskErrorVO;
import com.nanjing.water.repository.vo.QuartzTaskInfoVO;
import com.nanjing.water.repository.vo.QuartzTaskRecordVO;
import com.nanjing.water.service.quartz.QuartzService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

/**
 * 03.任务调度
 * @author lin.liu
 * @order 03
 */
@NonLogin
@Controller
@RequestMapping("quartz")
public class QuartzController {
    private static final Logger logger = LoggerFactory.getLogger(QuartzController.class);

    @Autowired
    private QuartzService quartzService;

    /**
     * 任务列表
     * @param request 请求参数
     */
    @ResponseBody
    @PostMapping("listTask")
    public ExecutedResult<PagerResult<QuartzTaskInfoVO>> listTask(@RequestBody SearchQuartzTaskInfo request) {
        try {
            return quartzService.listTask(request);
        } catch (Exception e) {
            logger.error("listTask", e);
            return ExecutedResult.failed(e.getMessage());
        }
    }

    /**
     * 添加任务
     * @param request 请求参数
     */
    @ResponseBody
    @PostMapping("addTask")
    public ExecutedResult<String> addTask(@RequestBody ReqCreateQuartzTaskInfo request) {
        try {
            return quartzService.addTask(request);
        } catch (Exception e) {
            logger.error("addTask", e);
            return ExecutedResult.failed(e.getMessage());
        }
    }

    /**
     * 修改任务
     * @param request 请求参数
     */
    @ResponseBody
    @PostMapping("editTask")
    public ExecutedResult<String> editTask(@RequestBody ReqModifyQuartzTaskInfo request) {
        try {
            return quartzService.updateTask(request);
        } catch (Exception e) {
            logger.error("editTask", e);
            return ExecutedResult.failed(e.getMessage());
        }
    }

    /**
     * 启动 或者 暂定定时任务
     * @param taskId 任务id
     */
    @ResponseBody
    @PostMapping("optionJob/{taskId}")
    public ExecutedResult<String> optionJob(@PathVariable Long taskId) {
        try {
            return quartzService.optionJob(taskId);
        } catch (Exception e) {
            logger.error("optionJob", e);
            return ExecutedResult.failed(e.getMessage());
        }
    }

    /**
     * 立即运行一次定时任务
     * @param request 请求参数
     */
    @ResponseBody
    @PostMapping("runTaskRightNow")
    public ExecutedResult<String> runTaskRightNow(@RequestBody ReqRunTaskRightNow request) {
        try {
            return quartzService.runTaskRightNow(request);
        } catch (Exception e) {
            logger.error("/runTaskRightNow", e);
            return ExecutedResult.failed(e.getMessage());
        }
    }

    /**
     * 定时任务执行情况
     *
     * @param search 请求参数
     */
    @ResponseBody
    @PostMapping("taskRecords")
    public ExecutedResult<PagerResult<QuartzTaskRecordVO>> taskRecords(@RequestBody SearchQuartzTaskRecord search) {
        try {
            return quartzService.taskRecords(search);
        } catch (Exception e) {
            logger.error("/taskRecords", e);
            return ExecutedResult.failed(e.getMessage());
        }
    }

    /**
     * 定时任务错误详情
     *
     * @param recordId 执行记录id
     */
    @ResponseBody
    @GetMapping("taskErrors/{recordId}")
    public ExecutedResult<QuartzTaskErrorVO> detailTaskErrors(@PathVariable String recordId) {
        try {
            return quartzService.detailTaskErrors(recordId);
        } catch (Exception e) {
            logger.error("/taskErrors", e);
            return ExecutedResult.failed(e.getMessage());
        }
    }
}