package com.example.his.api.mis.controller;

import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONUtil;
import com.example.his.api.common.result.R;
import com.example.his.api.common.utils.MinioUtil;
import com.example.his.api.db.pojo.GoodsEntity;
import com.example.his.api.exception.HisException;
import com.example.his.api.mis.service.GoodsService;
import com.example.his.api.req.MisGoods.*;
import com.github.pagehelper.PageInfo;
import io.lettuce.core.dynamic.annotation.Param;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.InputStream;
import java.util.*;

@RestController("MisGoodsController")
@RequestMapping("/mis/goods")
public class GoodsController {

    @Resource
    private GoodsService goodsService;

    @Resource
    private MinioUtil minioUtil;

    /**
     * 体检套餐-分页查询
     * @param goodsSearchReq
     * @return
     */
    @PostMapping("/searchGoodsByPage")
    @SaCheckPermission(value = {"BUSINESS:GOODS","BUSINESS:GOODS:SELECT"}, mode = SaMode.OR)
    public R searchGoodsByPage(@RequestBody GoodsSearchReq goodsSearchReq) {
        Map param = BeanUtil.beanToMap(goodsSearchReq);
        PageInfo<HashMap> list = goodsService.searchGoodsByPage(param);
        return R.success(list);
    }

    /**
     * 体检套餐-查询全部
     * @return
     */
    @GetMapping("/searchGoods")
    @SaCheckPermission(value = {"BUSINESS:GOODS","BUSINESS:GOODS:SELECT"}, mode = SaMode.OR)
    public R searchGoods() {
        ArrayList<HashMap> list = goodsService.searchGoods();
        return R.success(list);
    }

    /**
     * 体检套餐-查询id
     * @param id
     * @return
     */
    @GetMapping("/searchGoodsById")
    @SaCheckPermission(value = {"BUSINESS:GOODS","BUSINESS:GOODS:SELECT"}, mode = SaMode.OR)
    public R searchGoodsById(@RequestParam Integer id) {
        HashMap goods = goodsService.searchGoodsById(id);
        return R.success(goods);
    }

    /**
     * 体检套餐-更新checkup
     * @param form
     * @param file
     * @return
     */
    @PostMapping("/updateGoodsCheckup")
    @SaCheckPermission(value = {"BUSINESS:GOODS","BUSINESS:GOODS:UPDATE"}, mode = SaMode.OR)
    public R updateGoodsCheckup(@Valid GoodsUploadExcelReq form, MultipartFile file) {
        int rows = goodsService.updateGoodsCheckup(form.getId(), file);
        return R.success(rows);
    }

    /**
     * 体检套餐-上下架
     * @param form
     * @return
     */
    @PostMapping("/updateGoodsStatus")
    @SaCheckPermission(value = {"BUSINESS:GOODS","BUSINESS:GOODS:UPDATE"}, mode = SaMode.OR)
    public R updateGoodsStatus(@RequestBody @Valid GoodsUpdateStatus form) {
        Map param = BeanUtil.beanToMap(form);
        int rows = goodsService.updateGoodsStatus(param);
        return R.success(rows);
    }

    /**
     * 体检套餐-编辑
     * @param form
     * @return
     */
    @PostMapping("/editGoods")
    @SaCheckPermission(value = {"BUSINESS:GOODS","BUSINESS:GOODS:UPDATE","BUSINESS:GOODS:INSERT"}, mode = SaMode.OR)
    public R editGoods(@RequestBody @Valid GoodsEditReq form) {
        GoodsEntity entity = BeanUtil.toBean(form, GoodsEntity.class, CopyOptions.create().setIgnoreProperties("checkup_1", "checkup_2", "checkup_3", "checkup_4", "tag"));
        String temp = null;
        if (form.getCheckup_1() != null) {
            //手动将ArrayList转换成JSON数组字符串，给POJO对象的checkup_1变量赋值
            temp = JSONUtil.parseArray(form.getCheckup_1()).toString();
            entity.setCheckup_1(temp);
        }

        if (form.getCheckup_2() != null) {
            temp = JSONUtil.parseArray(form.getCheckup_2()).toString();
            entity.setCheckup_2(temp);
        }

        if (form.getCheckup_3() != null) {
            temp = JSONUtil.parseArray(form.getCheckup_3()).toString();
            entity.setCheckup_3(temp);
        }

        if (form.getCheckup_4() != null) {
            temp = JSONUtil.parseArray(form.getCheckup_4()).toString();
            entity.setCheckup_4(temp);
        }

        if (form.getTag() != null) {
            temp = JSONUtil.parseArray(form.getTag()).toString();
            entity.setTag(temp);
        }

        int rows;
        if (ObjectUtil.isEmpty(form.getId())) {
            rows = goodsService.insertGoods(entity);

        } else {
            rows = goodsService.updateGoods(entity);
        }

        return R.success(rows);
    }

    /**
     * 体检套餐-批量删除
     * @param deleteReq
     * @return
     */
    @PostMapping("/deleteBatchGoods")
    @SaCheckPermission(value = {"BUSINESS:GOODS","BUSINESS:GOODS:DELETE"}, mode = SaMode.OR)
    public R deleteBatchGoods(@RequestBody @Valid GoodsDeleteReq deleteReq) {
        Map param = BeanUtil.beanToMap(deleteReq);
        int rows = goodsService.deleteBatchGoods(param);
        return R.success(rows);
    }

    /**
     * 体检套餐-上传图片
     * @param file
     * @return
     */
    @PostMapping("/uploadImage")
    @SaCheckPermission(value = {"BUSINESS:GOODS", "BUSINESS:GOODS:UPLOAD"}, mode = SaMode.OR)
    public R uploadImage(@Param("file") MultipartFile file) {
        String path = goodsService.uploadImage(file);
        return R.success(path);
    }

    /**
     * 体检套餐-下载excel
     * @param id
     * @param response
     */
    @GetMapping("/downloadExcel")
    @SaCheckPermission(value = {"BUSINESS:GOODS","BUSINESS:GOODS:DOWNLOADING"}, mode = SaMode.OR)
    public void downloadCheckupExcel(Integer id, HttpServletResponse response) {
        //设置下载文件的名称
        response.setHeader("Content-Disposition", "attachment;filename=" + id + ".xlsx");
        //该MIME类型会让浏览器弹出下载对话框
        response.setContentType("application/x-download");
        response.setCharacterEncoding("UTF-8");
        String path = "goods/checkup/" + id + ".xlsx";
        try {
            //读取Minio存储文件的输入流
            InputStream in = minioUtil.downloadFile(path);
            BufferedInputStream bin = new BufferedInputStream(in);
            //向响应输出数据的输出流
            ServletOutputStream out = response.getOutputStream();
            BufferedOutputStream bout = new BufferedOutputStream(out);
            //把输入流中的数据拷贝到输出流
            IoUtil.copy(bin, bout);
        } catch (Exception e) {
            throw new HisException("文档下载失败");
        }

    }



}
