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

import cn.hutool.core.io.FileUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.jeecg.common.constant.SymbolConstant;
import org.jeecg.config.JeecgBaseConfig;
import org.jeecg.modules.baogao.convert.BaogaoConvert;
import org.jeecg.modules.baogao.dto.ItdmBaogaoCreateDTO;
import org.jeecg.modules.baogao.entity.ItdmBaogao;
import org.jeecg.modules.baogao.mapper.ItdmBaogaoMapper;
import org.jeecg.modules.baogao.service.IItdmBaogaoService;
import org.jeecg.modules.baogao.util.PoiTiUtils;
import org.jeecg.modules.baogao.vo.ItdmBaogaoListVO;
import org.jeecg.modules.baogao.vo.ItdmBaogaoVO;
import org.jeecg.modules.chuanganqi.entity.ItdmChuanganqi;
import org.jeecg.modules.chuanganqi.mapper.ItdmChuanganqiMapper;
import org.jeecg.modules.itdmDevice.entity.ItdmDevice;
import org.jeecg.modules.itdmDevice.mapper.ItdmDeviceMapper;
import org.jeecg.modules.itdmGongDan.mapper.ItdmGongdanMasterMapper;
import org.jeecg.modules.itdmGongDan.mapper.ItdmTestPlanMapper;
import org.jeecg.modules.moban.entity.ItdmMoban;
import org.jeecg.modules.moban.mapper.ItdmMobanMapper;
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.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.ParseException;
import java.util.*;
import java.util.stream.Collectors;

/**
 * @Description: 报告生成
 * @Author: jeecg-boot
 * @Date: 2023-05-19
 * @Version: V1.0
 */
@Service
@SuppressWarnings("all")
public class ItdmBaogaoServiceImpl extends ServiceImpl<ItdmBaogaoMapper, ItdmBaogao> implements IItdmBaogaoService {
    @Resource
    JeecgBaseConfig jeecgBaseConfig;

    @Autowired
    private ItdmMobanMapper itdmMobanMapper;
    @Autowired
    private ItdmWeituoInfoMapper itdmWeituoInfoMapper;

    @Autowired
    private ItdmWeituoYangpinMapper itdmWeituoYangpinMapper;
    @Autowired
    private ItdmWeituoYangpinExtendMapper itdmWeituoYangpinExtendMapper;


    @Autowired
    private ItdmMobanMapper mobanMapper;


    @Autowired
    private ItdmTestPlanMapper tdmTestPlanMapper;


    @Autowired
    private ItdmGongdanMasterMapper itdmGongdanMaster;


    @Autowired
    private ItdmDeviceMapper itdmDeviceMapper;


    @Autowired
    private ItdmChuanganqiMapper chuangeMapper;


    @Autowired
    private ItdmBaogaoMapper itdmGongdanShujuMapper;


    @Override
    public Page<ItdmBaogaoListVO> pageVO(Page<ItdmBaogao> pageVO, QueryWrapper<ItdmBaogao> queryWrapper) {


        Page<ItdmBaogao> page = this.getBaseMapper().selectPage(pageVO, queryWrapper);

        List<ItdmBaogaoListVO> listVO = new ArrayList<>();

        for (ItdmBaogao itdmBaogao : page.getRecords()) {

            ItdmMoban itdmMoban = mobanMapper.selectById(itdmBaogao.getBaogaoType());
            ItdmBaogaoListVO vo = BaogaoConvert.INSTANCE.convert(itdmBaogao);
            vo.setBaogaoTypeName(itdmMoban.getName());
            listVO.add(vo);

        }
        return BaogaoConvert.INSTANCE.converter(page, listVO);
    }

    @Override
    public List<ItdmWeituoInfo> queryweituoList() {
        return itdmWeituoInfoMapper.selectList(null);
    }


    @Override
    public List<ItdmWeituoYangpin> queryYangpinList(String weituoId) {
        return itdmWeituoYangpinMapper.selectList(Wrappers.lambdaQuery(ItdmWeituoYangpin.class).eq(
                ItdmWeituoYangpin::getWeituoId, weituoId
        ));
    }

    @Override
    public List<ItdmWeituoYangpinExtend> queryShiyanList(List<String> yangpinId) {
        return itdmWeituoYangpinExtendMapper.selectList(Wrappers.lambdaQuery(ItdmWeituoYangpinExtend.class).in(
                ItdmWeituoYangpinExtend::getYangpinId, yangpinId
        ));
    }

    @Override
    public ItdmMoban queryMubanById(String mubanid) {
        return itdmMobanMapper.selectById(mubanid);
    }


    @Override
    public String createBaogao(ItdmBaogaoCreateDTO dto) {
        ItdmWeituoInfo itdmWeituoInfo = itdmWeituoInfoMapper.selectById(dto.getWeituoId());
        ItdmBaogao itdmBaogao = BaogaoConvert.INSTANCE.convert(dto);
        itdmBaogao.setWeituoClient(itdmWeituoInfo.getWeituoClient());
        itdmBaogao.setWeituoNo(itdmWeituoInfo.getWeituoNo());
        itdmBaogao.setWeituoLxr(itdmWeituoInfo.getWeituoLxr());


        List<ItdmWeituoYangpin> yangpins = itdmWeituoYangpinMapper.selectList(Wrappers.lambdaQuery(ItdmWeituoYangpin.class).in(
                ItdmWeituoYangpin::getId, dto.getSampleIds()
        ));

        List<ItdmWeituoYangpinExtend> testItems = itdmWeituoYangpinExtendMapper.selectList(Wrappers.lambdaQuery(ItdmWeituoYangpinExtend.class).in(
                ItdmWeituoYangpinExtend::getId, dto.getTestItemsIds()
        ));


        itdmBaogao.setSampleNames(yangpins.stream().map(o -> o.getSampleName()).collect(Collectors.joining(",")));

        itdmBaogao.setTestItemsNames(testItems.stream().map(o -> o.getTestItems()).collect(Collectors.joining(",")));

        ItdmMoban itdmMoban = mobanMapper.selectById(dto.getBaogaoType());

        String fileName =  "word" + File.separator + System.currentTimeMillis() + ".docx";
        String filePath = jeecgBaseConfig.getPath().getUpload() + File.separator +fileName;
        FileUtil.touch(filePath);


        try {
            Map map = getMap(dto, itdmWeituoInfo, yangpins, testItems, getChuanganqiList(dto.getTestItemsIds()), getDeviceList(dto.getTestItemsIds()));

            PoiTiUtils.create(jeecgBaseConfig.getPath().getUpload() + File.separator + itdmMoban.getFilePath(), map,
                    new FileOutputStream(filePath));
        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }


        if (fileName.contains(SymbolConstant.DOUBLE_BACKSLASH)) {
            itdmBaogao.setFilePath(fileName.replace(SymbolConstant.DOUBLE_BACKSLASH, SymbolConstant.SINGLE_SLASH));
        }else{
            itdmBaogao.setFilePath(fileName);

        }

        this.baseMapper.insert(itdmBaogao);
        return filePath;
    }


    Map<String, Object> getMap(ItdmBaogaoCreateDTO dto, ItdmWeituoInfo wweotuo, List<ItdmWeituoYangpin> yweituoInfo, List<ItdmWeituoYangpinExtend> extendList,
                               List<ItdmChuanganqi> chuanges, List<ItdmDevice> deviceList) throws ParseException {

        Map<String, Object> map = new HashMap<>();

        map.put("reportNo", wweotuo.getWeituoNo());
        // map.put("time", wweotuo.getShenheTime() == null ? "   年    月   日" : DateUtils.parseDate(wweotuo.getShenheTime(), "yyyy年 MM月 dd日"));
        map.putAll(PoiTiUtils.getWeituoInfo(wweotuo));
        map.putAll(PoiTiUtils.getJIanceyiju(extendList));
        map.putAll(PoiTiUtils.getWeituoYangplList(yweituoInfo, extendList));
        map.putAll(PoiTiUtils.getBaogaoShebeiList(chuanges, deviceList));
        map.putAll(PoiTiUtils.getYuanshijilShebeiList(deviceList));
        map.putAll(PoiTiUtils.getYuanshijilChuanganqiList(chuanges));
        map.putAll(PoiTiUtils.getBaogaoInfo(yweituoInfo, extendList));
        map.putAll(PoiTiUtils.getYSjlInfo(wweotuo, yweituoInfo, extendList));
        map.put("wendu", dto.getWendu());
        map.put("shidu", dto.getShidu());
        map.put("daqiya", dto.getDaqiya());
        map.putAll(PoiTiUtils.getBaogaoImage(getBaogaoImage(dto), jeecgBaseConfig));

        map.putAll(PoiTiUtils.getYSdata(getBaogaoShuju(dto), this.getYSZItdmMobanPath()));


        return map;
    }


    private List<String> getBaogaoImage(ItdmBaogaoCreateDTO dto) {


        return tdmTestPlanMapper.getImageByShiyanid(dto.getWeituoId())
                .stream().distinct().collect(Collectors.toList());
    }

    private List<Map<String, Object>> getBaogaoShuju(ItdmBaogaoCreateDTO dto) {


        return tdmTestPlanMapper.getShujuByShiyanid(dto.getTestItemsIds())
                .stream().collect(Collectors.toList());
    }


    private List<ItdmDevice> getDeviceList(List<String> list) {


        List<String> shebeiids = tdmTestPlanMapper.geSBByShiyanid(list)
                .stream().distinct().collect(Collectors.toList());

        if (shebeiids == null || shebeiids.size() == 0) {
            return new ArrayList<>();
        }
        return itdmDeviceMapper.selectList(Wrappers.lambdaQuery(ItdmDevice.class).in(ItdmDevice::getId, shebeiids));
    }


    public List<ItdmChuanganqi> getChuanganqiList(List<String> list) {

        List<String> chuanganqitIds = new ArrayList<>();

        List<String> chuangants = tdmTestPlanMapper.geChuanganqitByShiyanid(list);


        for (String chuangant : chuangants) {
            if (StringUtils.isNotBlank(chuangant)) {
                String[] chuangantArr = chuangant.split(",");
                for (String ch : chuangantArr) {
                    chuanganqitIds.add(ch);
                }
            }

        }

        if (chuangants == null || chuangants.size() == 0) {
            return new ArrayList<>();
        }

        return chuangeMapper.selectList(Wrappers.lambdaQuery(ItdmChuanganqi.class)
                .in(ItdmChuanganqi::getId, chuanganqitIds.stream().distinct().collect(Collectors.toList())));


    }


    public String getYSZItdmMobanPath() {
        String filepath = mobanMapper.selectOne(Wrappers.lambdaQuery(ItdmMoban.class).eq(ItdmMoban::getName, "温湿度原始记录子模版")).getFilePath();

        return jeecgBaseConfig.getPath().getUpload() + File.separator + filepath;
    }


    @Override
    public ItdmBaogaoVO wordById(String id) {
        ItdmBaogao baoVo = this.baseMapper.selectById(id);
        String filepath = baoVo.getFilePath();
        String key = FileUtil.mainName(filepath) + "="+filepath.substring(0, filepath.lastIndexOf("/")).replaceAll("/", "=")+"=" + System.currentTimeMillis();
        String fileType = FileUtil.extName(filepath);
        String url = filepath;
        String title = FileUtil.getName(filepath);
        return new ItdmBaogaoVO(key, url,fileType, title);
    }


    public static void main(String[] args) {
        String s = "temap\\user.docx";
        System.out.println(s.replace(SymbolConstant.DOUBLE_BACKSLASH, SymbolConstant.SINGLE_SLASH));


        System.out.println(FileUtil.mainName(s));
    }
}
