package com.casic.missiles.controller;

import cn.hutool.core.lang.Assert;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.casic.missiles.core.base.controller.ExportController;
import com.casic.missiles.core.page.PageFactory;
import com.casic.missiles.enums.BusinessExceptionEnum;
import com.casic.missiles.enums.OperateTypeEnum;
import com.casic.missiles.exception.BusinessException;
import com.casic.missiles.model.MeterFile;
import com.casic.missiles.model.response.ResponseData;
import com.casic.missiles.service.IMeterFileService;
import com.casic.missiles.utils.MinioUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Objects;

/**
 * @Description: 计量文件
 * @Author: wangpeng
 * @Date: 2022/11/21 17:47
 */
@Api(tags = "计量文件管理接口")
@Controller
@RequestMapping("/meter/file")
public class MeterFileController extends ExportController {
    @Autowired
    private IMeterFileService meterFileService;
    @Autowired
    private MinioUtil minioUtil;

    /**
     * 文件列表，列表中查的是文件表中已审批的
     * 质量文件（计量法规、质量手册、程序文件、作业文件、技术能力、CNAS文件）、计量管理规章制度、计量管理办法、校准检测办法、计量规程
     */
    @ApiOperation("文件列表")
    @PostMapping("/listPage")
    @ResponseBody
    public Object listPage(@RequestBody MeterFile meterFile) {
        Page<MeterFile> page = PageFactory.defaultPage();
        return ResponseData.success(super.packForBT(meterFileService.listPage(page, meterFile)));
    }

    /**
     * 文件上传（minio）
     */
    @ApiOperation("文件上传")
    @PostMapping("/upload")
    @ResponseBody
    public Object upload(@RequestBody MultipartFile[] multipartFile) {
        Assert.isFalse(Objects.isNull(multipartFile), () -> {
            throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL);
        });
        List<String> nameList = minioUtil.upload(multipartFile);
        return nameList;
    }

    /**
     * 文件下载（minio）
     */
    @ApiOperation("文件下载")
    @PostMapping("/download/{fileName}")
    @ResponseBody
    public Object upload(@PathVariable(name = "fileName") String fileName) {
        ResponseEntity<byte[]> download = minioUtil.download(fileName);
        return download;
    }

    /**
     * 查看详情（复用列表接口）
     */

    /**
     * 文件新建、编辑（废止）、删除
     * 流程：审批人列表要随着流程图信息一起上传
     *      前后端交互两种方案（待晓颖调研）：1、前端传和activiti流程图生成的json一样的json，后端转成bpmnModel（使用BpmnJsonConverter类的方法）
     *                                    2、前端直接传bpmn文件或bpmn的xml文件（使用BpmnXMLConverter类的方法）
     * 文件的审批状态字段要更新，保证文件表的状态及时更新，供各列表使用
     */
    @PostMapping("/{operation}")
    @ResponseBody
    public Object operation(@PathVariable(name = "operation") String operateType, @RequestBody MeterFile meterFile) {
        if(OperateTypeEnum.ADD.getOperateType().equals(operateType)) {
            return meterFileService.addFile(meterFile);
        }else if(OperateTypeEnum.UPDATE.getOperateType().equals(operateType)){
            return meterFileService.updateFile(meterFile);
        }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){
            return meterFileService.deleteFile(meterFile);
        }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){
            return meterFileService.deleteBatchFile(meterFile.getIds());
        }
        return null;
    }

    /**
     * 文件审批，各审批状态的列表都是查文件表，和activiti中获取任务中businessKey关联，参考查询我的待办任务列表接口，里面的TaskInfo类比文件表实体
     *          全部：所有状态的单据
     *          草稿箱：发起者已保存，但未提交的单据
     *          待审批：流程到该审批者用户，用户要去审批的单据（采用activiti自己待办任务列表实现）
     *          审批中：管理员角色可以查看所有的未完成的任务（activiti查看所有待办任务列表实现），发起者可查看自己的（google工作流有收藏查看发起者自己的流程方法）
     *          已通过：管理员角色可以查看所有的，发起者可查看自己的，审批者可查看流程中有自己的（google工作流有收藏查看有参与的流程方法）
     *          未通过：同已通过
     *          已取消：发起者取消的单据
     */
}
