package org.jeecg.modules.weituo.service.impl;

import cn.hutool.core.io.IoUtil;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.jeecg.common.exception.JeecgBootException;
import org.jeecg.modules.baogao.dto.ItdmBaogaoCreateDTO;
import org.jeecg.modules.baogao.service.IItdmBaogaoService;
import org.jeecg.modules.itdmFirstPage.entity.ItdmTask;
import org.jeecg.modules.itdmFirstPage.mapper.ItdmTaskMapper;
import org.jeecg.modules.weituo.common.ShenheStatus;
import org.jeecg.modules.weituo.convert.WeituoConvert;
import org.jeecg.modules.weituo.dto.WeituoInsertCommand;
import org.jeecg.modules.weituo.dto.WeituoUpdateCommand;
import org.jeecg.modules.weituo.entity.ItdmWeituoInfo;
import org.jeecg.modules.weituo.entity.ItdmWeituoYangpin;
import org.jeecg.modules.weituo.entity.ItdmWeituoYangpinExtend;
import org.jeecg.modules.weituo.mapper.ItdmWeituoInfoMapper;
import org.jeecg.modules.weituo.mapper.ItdmWeituoYangpinExtendMapper;
import org.jeecg.modules.weituo.mapper.ItdmWeituoYangpinMapper;
import org.jeecg.modules.weituo.service.IItdmWeituoInfoService;
import org.jeecg.modules.weituo.vo.ItdmWeituoInfoInfoVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * @Description: 委托信息
 * @Author: jeecg-boot
 * @Date: 2023-05-17
 * @Version: V1.0
 */
@Service
public class ItdmWeituoInfoServiceImpl extends ServiceImpl<ItdmWeituoInfoMapper, ItdmWeituoInfo> implements IItdmWeituoInfoService {


    @Autowired
    private ItdmWeituoYangpinMapper yangpinMapper;

    @Autowired
    private ItdmWeituoYangpinExtendMapper yangpinExtendMapper;

    @Autowired
    private ItdmWeituoInfoMapper itdmWeituoInfoMapper;
    @Autowired
    private ItdmTaskMapper taskMapper;

    @Autowired

    private IItdmBaogaoService itdmBaogaoService;

    /**
     * 根据委托单位查询委托信息列表
     */
    public List<ItdmWeituoInfo> selectWTListByClient(String weituoClient) {
        return itdmWeituoInfoMapper.selectWTListByClient(weituoClient);
    }

    public List<ItdmWeituoYangpin> selectItdmWeituoYangpinCompany() {
        QueryWrapper<ItdmWeituoYangpin> queryWrapper = new QueryWrapper<ItdmWeituoYangpin>();
        queryWrapper.select("distinct sample_manufacturer");
        return yangpinMapper.selectList(queryWrapper);
    }

    /**
     * 查询委托单位名称（不重复）
     */
    public List<String> selectDistinctClientList() {
        return itdmWeituoInfoMapper.selectDistinctClientList();
    }

    @Transactional
    @Override
    public void saveWeituo(WeituoInsertCommand command) {

        ItdmWeituoInfo itdmWeituoInfo = WeituoConvert.INSTANCE.convert(command);
        itdmWeituoInfo.setShenheStatus("0");


        this.baseMapper.insert(itdmWeituoInfo);


        for (WeituoInsertCommand.WeituoYangpin yangpin : command.getYangpins()) {
            ItdmWeituoYangpin itdmWeituoYangpin = WeituoConvert.INSTANCE.convert(yangpin, itdmWeituoInfo.getId());
            this.yangpinMapper.insert(itdmWeituoYangpin);

            for (WeituoInsertCommand.WeituoYangPinShiYan shiYan : command.getPinShiYans().stream()
                    .filter(i -> i.getYangpinKeyId().equals(yangpin.getSampleName())).collect(Collectors.toList())) {

                ItdmWeituoYangpinExtend yangpinExtend = WeituoConvert.INSTANCE.convert(shiYan, itdmWeituoYangpin.getId(), itdmWeituoInfo.getId());
                this.yangpinExtendMapper.insert(yangpinExtend);


            }

        }

        //新增一条经理待审核的task
        ItdmTask itdmTask = new ItdmTask();
        itdmTask.setTaskRole("经理");
//        itdmTask.setTaskUser();
        itdmTask.setTaskStatus(0);//待办
        itdmTask.setWeituoId(itdmWeituoInfo.getId());
        itdmTask.setTaskContent("委托审核");
        taskMapper.insert(itdmTask);

    }

    @Transactional
    @Override
    public void updateWeituo(WeituoUpdateCommand command) {
        ItdmWeituoInfo itdmWeituoInfo = WeituoConvert.INSTANCE.convert(command);


        ItdmWeituoInfo select = this.baseMapper.selectById(command.getId());


        if (Objects.equals(select.getShenheStatus(), ShenheStatus.t.getCode())) {
            throw new JeecgBootException("审核通过不能修改数据");
        }

        this.baseMapper.updateById(itdmWeituoInfo);


        this.yangpinMapper.delete(Wrappers.lambdaQuery(ItdmWeituoYangpin.class).eq(ItdmWeituoYangpin::getWeituoId, command.getId()));
        this.yangpinExtendMapper.delete(Wrappers.lambdaQuery(ItdmWeituoYangpinExtend.class).eq(ItdmWeituoYangpinExtend::getWeituoId, command.getId()));

        for (WeituoUpdateCommand.WeituoYangpin yangpin : command.getYangpins()) {
            ItdmWeituoYangpin itdmWeituoYangpin = WeituoConvert.INSTANCE.convert(yangpin, command.getId());
            this.yangpinMapper.insert(itdmWeituoYangpin);

            for (WeituoUpdateCommand.WeituoYangPinShiYan shiYan : command.getPinShiYans().stream()
                    .filter(i -> i.getYangpinKeyId().equals(yangpin.getSampleName())).collect(Collectors.toList())) {

                ItdmWeituoYangpinExtend yangpinExtend = WeituoConvert.INSTANCE.convert(shiYan, itdmWeituoYangpin.getId(), itdmWeituoInfo.getId());
                this.yangpinExtendMapper.insert(yangpinExtend);


            }

        }
    }


    @Override
    public ItdmWeituoInfoInfoVO findById(String id) {

        ItdmWeituoInfoInfoVO itdmWeituoInfo = WeituoConvert.INSTANCE.convert(id);
        List<ItdmWeituoYangpin> yangpinExtendList = yangpinMapper.selectList(Wrappers.lambdaQuery(ItdmWeituoYangpin.class).eq(ItdmWeituoYangpin::getWeituoId, id));


        List<ItdmWeituoYangpinExtend> yangpinExtends = yangpinExtendMapper.selectList(
                Wrappers.lambdaQuery(ItdmWeituoYangpinExtend.class).eq(ItdmWeituoYangpinExtend::getWeituoId, id));
        itdmWeituoInfo.setYangpins(WeituoConvert.INSTANCE.convertList(yangpinExtendList));
        itdmWeituoInfo.setPinShiYans(yangpinExtends.stream().map(i -> WeituoConvert.INSTANCE.convert(i, yangpinExtendList)).collect(Collectors.toList()));
        itdmWeituoInfo.setData(WeituoConvert.INSTANCE.convert(this.baseMapper.selectById(id)));
        return itdmWeituoInfo;
    }

    @Override
    @Transactional
    public void deleteById(String id) {

        ItdmWeituoInfo itdmWeituoInfo = this.baseMapper.selectById(id);
        if (Objects.equals(itdmWeituoInfo.getShenheStatus(), ShenheStatus.t.getCode())) {
            throw new JeecgBootException("审核通过不能修改数据");
        }
        this.baseMapper.deleteById(id);
        this.yangpinMapper.delete(Wrappers.lambdaQuery(ItdmWeituoYangpin.class).eq(ItdmWeituoYangpin::getWeituoId, id));
        this.yangpinExtendMapper.delete(Wrappers.lambdaQuery(ItdmWeituoYangpinExtend.class).eq(ItdmWeituoYangpinExtend::getWeituoId, id));

        //删除对应委托id的task
        Map<String, Object> map = new HashMap<>();
        map.put("weituo_id", id);
        taskMapper.deleteByMap(map);
    }


    @Override
    @Transactional
    public void deleteByIds(List<String> id) {


        id.forEach(i -> {
            ItdmWeituoInfo itdmWeituoInfo = this.baseMapper.selectById(i);
            if (Objects.equals(itdmWeituoInfo.getShenheStatus(), ShenheStatus.t.getCode())) {
                throw new JeecgBootException("审核通过不能修改数据");
            }
        });
        this.baseMapper.deleteBatchIds(id);
        this.yangpinMapper.delete(Wrappers.lambdaQuery(ItdmWeituoYangpin.class).in(ItdmWeituoYangpin::getWeituoId, id));
        this.yangpinExtendMapper.delete(Wrappers.lambdaQuery(ItdmWeituoYangpinExtend.class).in(ItdmWeituoYangpinExtend::getWeituoId, id));


    }


    @Override
    public void word(String id, HttpServletResponse response) throws IOException {
        ItdmBaogaoCreateDTO description = new ItdmBaogaoCreateDTO();
        description.setWeituoId(id);
        List<String> sampleIds = yangpinMapper.selectList(Wrappers.lambdaQuery(ItdmWeituoYangpin.class).eq(ItdmWeituoYangpin::getWeituoId, id)).stream().map(ItdmWeituoYangpin::getId).collect(Collectors.toList());
        List<String> testItemsIds = yangpinExtendMapper.selectList(Wrappers.lambdaQuery(ItdmWeituoYangpinExtend.class).eq(ItdmWeituoYangpinExtend::getWeituoId, id)).stream().map(ItdmWeituoYangpinExtend::getId).collect(Collectors.toList());

        description.setSampleIds(sampleIds);

        description.setTestItemsIds(testItemsIds);
        description.setBaogaoType("1660819812871245825");


        String file = itdmBaogaoService.createBaogao(description);

        response.setContentType("application/octet-stream");
        response.setHeader("Content-disposition", "attachment;filename=\"" + "out_template.docx" + "\"");

        OutputStream out = response.getOutputStream();

        try (InputStream inputStream = Files.newInputStream(Paths.get(file))) {
            IoUtil.copy(inputStream, out);

        }


    }
}
