package cn.iocoder.dashboard.modules.system.controller.errorcode;

import cn.iocoder.dashboard.common.pojo.CommonResult;
import cn.iocoder.dashboard.common.pojo.PageResult;
import cn.iocoder.dashboard.modules.system.controller.errorcode.dto.ErrorCodeAutoGenerateDTO;
import cn.iocoder.dashboard.modules.system.controller.errorcode.dto.ErrorCodeCreateDTO;
import cn.iocoder.dashboard.modules.system.controller.errorcode.dto.ErrorCodePageDTO;
import cn.iocoder.dashboard.modules.system.controller.errorcode.dto.ErrorCodeUpdateDTO;
import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.ErrorCodeVO;
import cn.iocoder.dashboard.modules.system.convert.errorcode.ErrorCodeConvert;
import cn.iocoder.dashboard.modules.system.service.errorcode.ErrorCodeService;
import cn.iocoder.dashboard.modules.system.service.errorcode.bo.ErrorCodeBO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.validation.constraints.NotNull;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import static cn.iocoder.dashboard.common.pojo.CommonResult.success;

@Api(tags = "错误码")
@RestController
@RequestMapping("/system/error-code")
public class ErrorCodeController {

    @Resource
    private ErrorCodeService errorCodeService;

    /**
     * 获得指定分组下的错误码列表
     *
     * @param group 错误码分组
     * @param minUpdateTime 最小更新时间，允许为空。
     *                      通过该参数，我们可以增量获取超过 minUpdateTime 时间的错误码
     * @return 错误码列表
     */
    @ApiOperation("获取指定分组下的状态码")
    @GetMapping("/list-group")
    public CommonResult<List<ErrorCodeVO>> listErrorCodes(@NotNull(message = "错误码分组不能为空") String group, Date minUpdateTime) {
        return success(ErrorCodeConvert.INSTANCE.convertList02(errorCodeService.listErrorCodes(group, minUpdateTime)));
    }

    /**
     * 自动生成错误码
     *
     * @param autoGenerateDTOs 自动生成信息 DTO
     */
    @ApiOperation("自动生成错误码")
    @PostMapping("/generate")
    public CommonResult<Boolean> autoGenerateErrorCodes(@RequestBody List<ErrorCodeAutoGenerateDTO> autoGenerateDTOs) {
        errorCodeService.autoGenerateErrorCodes(ErrorCodeConvert.INSTANCE.convertList03(autoGenerateDTOs));
        return success(Boolean.TRUE);
    }


    /**
     * 创建错误码
     *
     * @param createDTO 创建错误码 DTO
     * @return 错误码编号
     */
    @ApiOperation("创建错误码")
    @PostMapping("/create")
    public CommonResult<Integer> createErrorCode(@RequestBody ErrorCodeCreateDTO createDTO) {
        return success(errorCodeService.createErrorCode(ErrorCodeConvert.INSTANCE.convert(createDTO)).getId());
    }

    /**
     * 更新错误码
     *
     * @param updateDTO 更新错误码 DTO
     */
    @ApiOperation("更新错误码")
    @PatchMapping("/update")
    public CommonResult<Boolean> updateErrorCode(@RequestBody ErrorCodeUpdateDTO updateDTO) {
        errorCodeService.updateErrorCode(ErrorCodeConvert.INSTANCE.convert(updateDTO));
        return success(Boolean.TRUE);
    }

    /**
     * 删除错误码
     *
     * @param errorCodeId 错误码编号
     */
    @ApiOperation("删除错误码")
    @DeleteMapping("delete")
    public CommonResult<Boolean> deleteErrorCode(Integer errorCodeId) {
        errorCodeService.deleteErrorCode(errorCodeId);
        return success(Boolean.TRUE);
    }

    /**
     * 获得错误码
     *
     * @param errorCodeId 错误码编号
     * @return 错误码
     */
    @ApiOperation("获取错误码")
    @GetMapping("/query")
    public CommonResult<ErrorCodeVO> getErrorCode(Integer errorCodeId) {
        return success(ErrorCodeConvert.INSTANCE.convert(errorCodeService.getErrorCode(errorCodeId)));
    }

    /**
     * 获得错误码列表
     *
     * @param errorCodeIds 错误码编号列表
     * @return 错误码列表
     */
    @ApiOperation("获取错误码列表")
    @GetMapping("/query-ids")
    public CommonResult<List<ErrorCodeVO>> listErrorCodes(@RequestBody List<Integer> errorCodeIds) {
        return success(ErrorCodeConvert.INSTANCE.convertList02(errorCodeService.listErrorCodes(errorCodeIds)));
    }

    /**
     * 获得错误码分页
     *
     * @param pageDTO 错误码分页查询
     * @return 错误码分页结果
     */
    @ApiOperation("获取错误码分页列表")
    @GetMapping("/page")
    public CommonResult<PageResult<ErrorCodeVO>> pageErrorCode(ErrorCodePageDTO pageDTO) {
        final PageResult<ErrorCodeBO> pageResult = errorCodeService.pageErrorCode(ErrorCodeConvert.INSTANCE.convert(pageDTO));
        return success(ErrorCodeConvert.INSTANCE.convertPage(pageResult));
    }

    @InitBinder
    protected void init(HttpServletRequest request, ServletRequestDataBinder binder) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        dateFormat.setLenient(false);
        binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
    }

}
