package com.infynova.udi.controller;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.infynova.udi.common.api.ResponseData;
import com.infynova.udi.common.context.SpringContextUtils;
import com.infynova.udi.dto.*;
import com.infynova.udi.service.helper.UdiEasyExcelHelper;
import com.infynova.udi.service.TaskImportService;
import com.infynova.udi.service.TaskService;
import com.infynova.udi.vo.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.validation.Valid;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

@Slf4j
@Api(tags = "对码平台-任务")
@ApiSupport(order = 200)
@RestController
@RequestMapping("/match/task")
public class UdiMatchTaskController {

    @Resource
    private TaskService taskService;

    @Resource
    private TaskImportService taskImportService;

    @ApiOperationSupport(order = 100)
    @ApiOperation(value = "udi对码导入模板下载", notes = "udi对码导入模板下载")
    @GetMapping("template")
    public void template() throws IOException {
        log.info("template");
        TaskUdiExcelImportVo udiExcelVo = new TaskUdiExcelImportVo();
        String example = "样例-";
        udiExcelVo.setUdiCode(example + "6938954499349");
        udiExcelVo.setYiBaoOneCode(example + "C03380310700000");
        udiExcelVo.setYiBaoTwoCode(example + "C0338031070000001523");
        udiExcelVo.setYiBaoCode(example + "C03380310700000015230000046");
        udiExcelVo.setYiBaoCodePrefix(example + "C03");
        udiExcelVo.setCompanyName(example + "深圳市无境创新有限公司");
        udiExcelVo.setBrandName(example + "无境创新");
        udiExcelVo.setRegistryNo(example + "国械注准20240000001");
        udiExcelVo.setRegistryName(example + "人工踝关节假体");
        udiExcelVo.setRegistryStartTime("2000-01-01");
        udiExcelVo.setRegistryEndTime("2099-12-31");
        udiExcelVo.setRegistry(example + "深圳市无境创新有限公司");
        udiExcelVo.setProductCode(example + "infynova-DEMO-001");
        udiExcelVo.setProductFactoryCode(example + "0116001");
        //udiExcelVo.setInfynovaCode(example + );
        udiExcelVo.setProductName(example + "人工踝关节假体-跟距骨假体QH型26×26×23");
        udiExcelVo.setProductType("耗材");
        udiExcelVo.setSpecification(example + "QH型 26×26×23");
        udiExcelVo.setModel(example + "QH型 26×26×23");
        udiExcelVo.setMaterial(example + "不区分");
        udiExcelVo.setAsepticPackaging(example + "否");
        udiExcelVo.setBeforeSterilize(example + "是");
        udiExcelVo.setSterilizationMethod(example + "按照说明书要求进行灭菌");
        UdiEasyExcelHelper.export("udi对码导入模板", Collections.singletonList(udiExcelVo), TaskUdiExcelImportVo.class);
    }

    @ApiOperationSupport(order = 110)
    @ApiOperation(value = "udi对码导入", notes = "udi对码导入")
    @PostMapping("importData")
    public ResponseData<ImportItemResp> importData(@RequestParam("file") MultipartFile file) throws IOException {
        log.info("importData");
        return ResponseData.ok(taskImportService.importData(file));
    }

    @ApiOperationSupport(order = 120)
    @ApiOperation(value = "udi对码列表", notes = "udi对码列表")
    @PostMapping("list")
    public ResponseData<Page<UdiMatchListVo>> list(@RequestBody @Valid UdiMatchTaskListQry udiMatchTaskListQry){
        log.info("list:"+ JSON.toJSONString(udiMatchTaskListQry));
        udiMatchTaskListQry.setCreateBy(SpringContextUtils.getIdentityId());
        return ResponseData.ok(taskService.queryTaskPage(udiMatchTaskListQry));
    }

    @ApiOperationSupport(order = 130)
    @ApiOperation(value = "全部暂停", notes = "全部暂停")
    @PostMapping("allPause")
    public ResponseData<?> allPause(@RequestBody @Valid IdListQry idListQry){
        log.info("allPause:"+ JSON.toJSONString(idListQry));
        return ResponseData.ok(taskService.pauseTask(new ArrayList<>(idListQry.getIdList())));
    }

    @ApiOperationSupport(order = 131)
    @ApiOperation(value = "单个暂停", notes = "单个暂停")
    @PostMapping("onePause")
    public ResponseData<?> onePause(@RequestBody @Valid IdQry idQry){
        log.info("onePause:"+ JSON.toJSONString(idQry));
        return ResponseData.ok(taskService.pauseTask(Collections.singletonList(idQry.getId())));
    }

    @ApiOperationSupport(order = 140)
    @ApiOperation(value = "全部开始", notes = "全部开始")
    @PostMapping("allStart")
    public ResponseData<?> allStart(@RequestBody @Valid IdListQry idListQry){
        log.info("allStart:"+ JSON.toJSONString(idListQry));
        return ResponseData.ok(taskService.startTask(new ArrayList<>(idListQry.getIdList())));
    }

    @ApiOperationSupport(order = 141)
    @ApiOperation(value = "单个开始-开始上传", notes = "单个开始")
    @PostMapping("oneStart")
    public ResponseData<?> oneStart(@RequestBody @Valid IdQry idQry){
        log.info("oneStart:"+ JSON.toJSONString(idQry));
        return ResponseData.ok(taskService.startTask(Collections.singletonList(idQry.getId())));
    }

    @ApiOperationSupport(order = 150)
    @ApiOperation(value = "全部删除", notes = "全部删除")
    @PostMapping("allDelete")
    public ResponseData<?> allDelete(@RequestBody @Valid IdListQry idListQry){
        log.info("allDelete:"+ JSON.toJSONString(idListQry));
        return ResponseData.ok(taskService.deleteTask(new ArrayList<>(idListQry.getIdList())));
    }

    @ApiOperationSupport(order = 151)
    @ApiOperation(value = "单个删除", notes = "单个删除")
    @PostMapping("oneDelete")
    public ResponseData<?> oneDelete(@RequestBody @Valid IdQry idQry){
        log.info("oneDelete:"+ JSON.toJSONString(idQry));
        return ResponseData.ok(taskService.deleteTask(Collections.singletonList(idQry.getId())));
    }

    @ApiOperationSupport(order = 160)
    @ApiOperation(value = "对码进度", notes = "对码进度")
    @PostMapping("matchResult")
    public ResponseData<TaskMatchStatisticVo> matchResult(@RequestBody @Valid IdQry idQry){
        log.info("matchResult:"+ JSON.toJSONString(idQry));
        return ResponseData.ok(taskService.matchResult(idQry.getId()));
    }

    @ApiOperationSupport(order = 170)
    @ApiOperation(value = "获取下载链接", notes = "获取下载链接")
    @PostMapping("getDownloadUrl")
    public ResponseData<List<UdiMatchTaskFileDto>> getDownloadUrl(@RequestBody @Valid IdListQry idListQry){
        log.info("getDownloadUrl:"+ JSON.toJSONString(idListQry));
        return ResponseData.ok(taskService.getDownloadUrl(idListQry));
    }

}