package ink.wgink.module.examine.controller.api.question;

import ink.wgink.annotation.CheckRequestBodyAnnotation;
import ink.wgink.common.base.DefaultBaseController;
import ink.wgink.exceptions.SearchException;
import ink.wgink.interfaces.consts.ISystemConstant;
import ink.wgink.module.examine.pojo.dtos.question.QuestionTypeDTO;
import ink.wgink.module.examine.pojo.vos.question.QuestionTypeBatchVO;
import ink.wgink.module.examine.pojo.vos.question.QuestionTypeVO;
import ink.wgink.module.examine.service.question.IQuestionTypeService;
import ink.wgink.pojo.ListPage;
import ink.wgink.pojo.dtos.ZTreeDTO;
import ink.wgink.pojo.result.ErrorResult;
import ink.wgink.pojo.result.SuccessResult;
import ink.wgink.pojo.result.SuccessResultData;
import ink.wgink.pojo.result.SuccessResultList;
import ink.wgink.util.ReflectUtil;
import io.swagger.annotations.*;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Arrays;
import java.util.List;
import java.util.Map;

/**
 * @ClassName: QuestionTypeController
 * @Description: 试题类型
 * @Author: CodeFactory
 * @Date: 2021-04-04 11:40:13
 * @Version: 3.0
 **/
@Api(tags = ISystemConstant.API_TAGS_SYSTEM_PREFIX + "试题类型接口")
@RestController
@RequestMapping(ISystemConstant.API_PREFIX + "/question-type")
public class QuestionTypeController extends DefaultBaseController {

    @Autowired
    private IQuestionTypeService questionTypeService;

    @ApiOperation(value = "新增试题类型", notes = "新增试题类型接口")
    @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)})
    @PostMapping("save")
    @CheckRequestBodyAnnotation
    public synchronized SuccessResult save(@RequestBody QuestionTypeVO questionTypeVO) throws ReflectUtil.ReflectException {
        questionTypeService.save(questionTypeVO);
        return new SuccessResult();
    }

    @ApiOperation(value = "批量新增试题类型", notes = "批量新增试题类型接口")
    @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)})
    @PostMapping("save-batch")
    @CheckRequestBodyAnnotation
    public synchronized SuccessResult saveBatch(@RequestBody QuestionTypeBatchVO questionTypeBatchVO) throws ReflectUtil.ReflectException {
        questionTypeService.saveBatch(questionTypeBatchVO);
        return new SuccessResult();
    }

    @ApiOperation(value = "删除试题类型", notes = "删除试题类型接口")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "ids", value = "ID列表，用下划线分隔", paramType = "path", example = "1_2_3")
    })
    @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)})
    @DeleteMapping("remove/{ids}")
    public SuccessResult remove(@PathVariable("ids") String ids) {
        questionTypeService.remove(Arrays.asList(ids.split("\\_")));
        return new SuccessResult();
    }

    @ApiOperation(value = "修改试题类型", notes = "修改试题类型接口")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "questionTypeId", value = "试题类型ID", paramType = "path")
    })
    @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)})
    @PutMapping("update/{questionTypeId}")
    @CheckRequestBodyAnnotation
    public SuccessResult update(@PathVariable("questionTypeId") String questionTypeId, @RequestBody QuestionTypeVO questionTypeVO) throws ReflectUtil.ReflectException {
        questionTypeService.update(questionTypeId, questionTypeVO);
        return new SuccessResult();
    }

    @ApiOperation(value = "试题类型详情", notes = "试题类型详情接口")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "questionTypeId", value = "试题类型ID", paramType = "path")
    })
    @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)})
    @GetMapping("get/{questionTypeId}")
    public QuestionTypeDTO get(@PathVariable("questionTypeId") String questionTypeId) {
        return questionTypeService.get(questionTypeId);
    }

    @ApiOperation(value = "试题类型列表", notes = "试题类型列表接口")
    @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)})
    @GetMapping("list")
    public List<QuestionTypeDTO> list() {
        Map<String, Object> params = requestParams();
        return questionTypeService.list(params);
    }

    @ApiOperation(value = "试题类型列表", notes = "试题类型列表接口")
    @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)})
    @GetMapping("list/{questionTypeIds}")
    public List<QuestionTypeDTO> list(@PathVariable("questionTypeIds") String[] questionTypeIds) {
        return questionTypeService.list(Arrays.asList(questionTypeIds));
    }

    @ApiOperation(value = "试题类型分页列表", notes = "试题类型分页列表接口")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "page", value = "当前页码", paramType = "query", dataType = "int", defaultValue = "1"),
            @ApiImplicitParam(name = "rows", value = "显示数量", paramType = "query", dataType = "int", defaultValue = "20"),
            @ApiImplicitParam(name = "keywords", value = "关键字", paramType = "query", dataType = "String"),
            @ApiImplicitParam(name = "startTime", value = "开始时间", paramType = "query", dataType = "String"),
            @ApiImplicitParam(name = "endTime", value = "结束时间", paramType = "query", dataType = "String")
    })
    @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)})
    @GetMapping("listpage")
    public SuccessResultList<List<QuestionTypeDTO>> listPage(ListPage page) {
        Map<String, Object> params = requestParams();
        page.setParams(params);
        return questionTypeService.listPage(page);
    }

    @ApiOperation(value = "试题类型分页列表", notes = "试题类型分页列表接口")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "questionTypeParentId", value = "上级ID", paramType = "path"),
            @ApiImplicitParam(name = "page", value = "当前页码", paramType = "query", dataType = "int", defaultValue = "1"),
            @ApiImplicitParam(name = "rows", value = "显示数量", paramType = "query", dataType = "int", defaultValue = "20"),
            @ApiImplicitParam(name = "keywords", value = "关键字", paramType = "query", dataType = "String"),
            @ApiImplicitParam(name = "startTime", value = "开始时间", paramType = "query", dataType = "String"),
            @ApiImplicitParam(name = "endTime", value = "结束时间", paramType = "query", dataType = "String")
    })
    @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)})
    @GetMapping("listpage/{questionTypeParentId}")
    public SuccessResultList<List<QuestionTypeDTO>> listPage(@PathVariable("questionTypeParentId") String questionTypeParentId,
                                                             ListPage page) {
        Map<String, Object> params = requestParams();
        page.setParams(params);
        return questionTypeService.listPage(questionTypeParentId, page);
    }

    @ApiOperation(value = "试题类型统计", notes = "试题类型统计接口")
    @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)})
    @GetMapping("count")
    SuccessResultData<Integer> count() {
        Map<String, Object> params = requestParams();
        return new SuccessResultData<>(questionTypeService.count(params));
    }

    @ApiOperation(value = "试题类型zTree列表", notes = "试题类型zTree列表接口")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "id", value = "上级ID", paramType = "query", dataType = "String")
    })
    @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)})
    @GetMapping("list-ztree")
    public List<ZTreeDTO> listZTree() throws SearchException {
        Map<String, Object> params = requestParams();
        String questionTypeParentId = ISystemConstant.TREE_ROOT_ID;
        if (!StringUtils.isBlank(params.get(ISystemConstant.PARAMS_ID) == null ? null : params.get(ISystemConstant.PARAMS_ID).toString())) {
            questionTypeParentId = params.get(ISystemConstant.PARAMS_ID).toString();
        }
        params.put("questionTypeParentId", questionTypeParentId);
        return questionTypeService.listZTree(params);
    }

}