package com.iailab.module.model.job.controller.admin;

import com.iailab.framework.common.constant.Constant;
import com.iailab.framework.common.pojo.CommonResult;
import com.iailab.framework.common.pojo.PageResult;
import com.iailab.framework.common.util.object.BeanUtils;
import com.iailab.framework.common.util.validation.ValidationUtils;
import com.iailab.framework.common.validation.group.AddGroup;
import com.iailab.framework.common.validation.group.DefaultGroup;
import com.iailab.framework.common.validation.group.UpdateGroup;
import com.iailab.framework.tenant.core.context.TenantContextHolder;
import com.iailab.module.model.job.dto.ScheduleJobDTO;
import com.iailab.module.model.job.entity.ScheduleJobEntity;
import com.iailab.module.model.job.service.ScheduleJobService;
import com.iailab.module.model.job.vo.ScheduleJobReqVO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;

import static com.iailab.framework.common.pojo.CommonResult.success;

/**
 * 定时任务
 *
 * @author Mark sunlightcs@gmail.com
 */
@RestController
@RequestMapping("/model/job/schedule")
@Tag(name = "定时任务")
public class ScheduleJobController {
	@Resource
	private ScheduleJobService scheduleJobService;

	@GetMapping("page")
	@Operation(summary = "分页")
	@Parameters({
		@Parameter(name = Constant.PAGE, description = "当前页码,从1开始", required = true) ,
		@Parameter(name = Constant.LIMIT, description = "每页显示记录数", required = true) ,
		@Parameter(name = Constant.ORDER_FIELD, description = "排序字段") ,
		@Parameter(name = Constant.ORDER, description = "排序方式,可选值(asc、desc)") ,
		@Parameter(name = "beanName", description = "beanName")
	})
	@PreAuthorize("@ss.hasPermission('model:schedule:query')")
	public CommonResult<PageResult<ScheduleJobDTO>> page(@Validated ScheduleJobReqVO reqVO){
		reqVO.setTenantId(TenantContextHolder.getTenantId());
		PageResult<ScheduleJobEntity> page = scheduleJobService.page(reqVO);

		return success(BeanUtils.toBean(page, ScheduleJobDTO.class));
	}

	@GetMapping("info")
	@Operation(summary = "信息")
	@PreAuthorize("@ss.hasPermission('model:schedule:query')")
	public CommonResult<ScheduleJobDTO> info(@RequestParam("id") Long id){
		ScheduleJobDTO schedule = scheduleJobService.get(id);
		
		return new CommonResult<ScheduleJobDTO>().setData(schedule);
	}

	@PostMapping("/create")
	@Operation(summary = "保存")
	@PreAuthorize("@ss.hasPermission('model:schedule:create')")
	public CommonResult save(@RequestBody ScheduleJobDTO dto){
		ValidationUtils.validate(dto, AddGroup.class, DefaultGroup.class);
		
		scheduleJobService.save(dto);
		
		return new CommonResult();
	}

	@PutMapping("/update")
	@Operation(summary = "修改")
	@PreAuthorize("@ss.hasPermission('model:schedule:update')")
	public CommonResult update(@RequestBody ScheduleJobDTO dto){
		ValidationUtils.validate(dto, UpdateGroup.class, DefaultGroup.class);
				
		scheduleJobService.update(dto);
		
		return new CommonResult();
	}

	@DeleteMapping("/delete")
	@Operation(summary = "删除")
	@PreAuthorize("@ss.hasPermission('model:schedule:delete')")
	public CommonResult delete(@RequestParam("id") Long id){
		scheduleJobService.deleteBatch(id);
		
		return new CommonResult();
	}

	@PutMapping("/run")
	@Operation(summary = "立即执行")
	public CommonResult run(@RequestParam("id") Long id){
		Long[] ids = new Long[1];
		ids[0] = id;
		scheduleJobService.run(ids);
		
		return new CommonResult();
	}

	@PutMapping("/pause")
	@Operation(summary = "暂停")
	public CommonResult pause(@RequestParam("id") Long id){
		Long[] ids = new Long[1];
		ids[0] = id;
		scheduleJobService.pause(ids);
		
		return new CommonResult();
	}

	@PutMapping("/resume")
	@Operation(summary = "恢复")
	public CommonResult resume(@RequestParam("id") Long id){
		Long[] ids = new Long[1];
		ids[0] = id;
		scheduleJobService.resume(ids);
		
		return new CommonResult();
	}

}