package com.ema.admin.modules.system.controller;

import com.mybatisflex.core.paginate.Page;
import com.ema.admin.modules.system.entity.SysTimersJob;
import com.ema.admin.modules.system.enums.SysTimerJobEnum;
import com.ema.admin.modules.system.service.SysTimersJobService;
import com.ema.admin.modules.system.vo.SysTimersJobQueryVo;
import com.ema.common.tools.timer.TimerExeService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

/**
 * 定时任务 控制层。
 *
 * @author LIJIAN
 * @since 2026-03-24
 */
@RestController
@Api(tags = "定时任务接口")
@RequestMapping("/sysTimersJob")
public class SysTimersJobController {

    @Resource
    private SysTimersJobService sysTimersJobService;
    @Resource
    private TimerExeService timerExeService;

    /**
     * 添加定时任务。
     *
     * @param sysTimersJob 定时任务
     * @return {@code true} 添加成功，{@code false} 添加失败
     */
    @PostMapping("save")
    @ApiOperation("保存定时任务")
    public boolean save(@RequestBody @ApiParam("定时任务") SysTimersJob sysTimersJob) {
        boolean save = sysTimersJobService.save(sysTimersJob);
        if (save && SysTimerJobEnum.Status.RUNNING.getCode().equals(sysTimersJob.getJobStatus())) {
            return timerExeService.startTimer(sysTimersJob.getId(), sysTimersJob.getCron(), sysTimersJob.getActionClass());
        }
        return save;
    }

    /**
     * 根据主键删除定时任务。
     *
     * @param id 主键
     * @return {@code true} 删除成功，{@code false} 删除失败
     */
    @DeleteMapping("remove/{id}")
    @ApiOperation("根据主键定时任务")
    public boolean remove(@PathVariable @ApiParam("定时任务主键") String id) {
        boolean remove = sysTimersJobService.removeById(id);
        if (remove) {
            return timerExeService.stopTimer(id);
        }
        return false;
    }

    /**
     * 根据主键更新定时任务。
     *
     * @param sysTimersJob 定时任务
     * @return {@code true} 更新成功，{@code false} 更新失败
     */
    @PutMapping("update")
    @ApiOperation("根据主键更新定时任务")
    public boolean update(@RequestBody @ApiParam("定时任务主键") SysTimersJob sysTimersJob) {
        boolean update = sysTimersJobService.updateById(sysTimersJob);
        if (update && SysTimerJobEnum.Status.STOP.getCode().equals(sysTimersJob.getJobStatus())) {
            return timerExeService.stopTimer(sysTimersJob.getId());
        } else if (update && SysTimerJobEnum.Status.RUNNING.getCode().equals(sysTimersJob.getJobStatus())) {
            return timerExeService.startTimer(sysTimersJob.getId(), sysTimersJob.getCron(), sysTimersJob.getActionClass());
        }
        return update;
    }

    /**
     * 查询所有定时任务。
     *
     * @return 所有数据
     */
    @GetMapping("list")
    @ApiOperation("查询所有定时任务")
    public List<SysTimersJob> list() {
        return sysTimersJobService.list();
    }

    /**
     * 根据定时任务主键获取详细信息。
     *
     * @param id 定时任务主键
     * @return 定时任务详情
     */
    @GetMapping("getInfo/{id}")
    @ApiOperation("根据主键获取定时任务")
    public SysTimersJob getInfo(@PathVariable @ApiParam("定时任务主键") String id) {
        return sysTimersJobService.getById(id);
    }

    /**
     * 分页查询定时任务（带条件）。
     *
     * @param queryVo 查询条件
     * @return 分页对象
     */
    @PostMapping("page")
    @ApiOperation("分页查询定时任务（带条件）")
    public Page<SysTimersJob> page(@RequestBody @ApiParam("查询条件") SysTimersJobQueryVo queryVo) {
        return sysTimersJobService.page(queryVo);
    }


    @PostMapping("stop/{id}")
    @ApiOperation("暂停定时任务")
    public boolean stop(@PathVariable @ApiParam("定时任务主键") String id) {
        SysTimersJob sysTimersJob = sysTimersJobService.getById(id);
        sysTimersJob.setJobStatus(SysTimerJobEnum.Status.STOP.getCode());
        boolean update = sysTimersJobService.updateById(sysTimersJob);
        if (update) {
            return timerExeService.stopTimer(id);
        }
        return false;
    }

    @PostMapping("start/{id}")
    @ApiOperation("启动定时任务")
    public boolean start(@PathVariable @ApiParam("定时任务主键") String id) {
        SysTimersJob sysTimersJob = sysTimersJobService.getById(id);
        sysTimersJob.setJobStatus(SysTimerJobEnum.Status.RUNNING.getCode());
        boolean update = sysTimersJobService.updateById(sysTimersJob);
        if (update) {
            return timerExeService.startTimer(sysTimersJob.getId(), sysTimersJob.getCron(), sysTimersJob.getActionClass());
        }
        return false;
    }

}
