package com.huimv.receive.service.impl;

import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.huimv.receive.common.token.TokenSign;
import com.huimv.receive.common.utils.Result;
import com.huimv.receive.common.utils.ResultCode;
import com.huimv.receive.common.utils.UploadImage;
import com.huimv.receive.entity.*;
import com.huimv.receive.mapper.*;
import com.huimv.receive.service.IBillCleanBeforeService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.Map;

/**
 * <p>
 * 洗消表 服务实现类
 * </p>
 *
 * @author author
 * @since 2024-03-11
 */
@Service
public class BillCleanBeforeServiceImpl extends ServiceImpl<BillCleanBeforeMapper, BillCleanBefore> implements IBillCleanBeforeService {

    @Autowired
    private BillCleanBeforeMapper billCleanBeforeMapper;
    @Autowired
    private UploadImage uploadImage;
    @Autowired
    private BaseProcessMapper processMapper;
    @Autowired
    private BaseLocationMapper locationMapper;
    @Autowired
    private BillPcrMapper pcrMapper;
    @Autowired
    private BillCleanMapper cleanMapper;
    @Autowired
    private BillIsolateMapper isolateMapper;
    @Autowired
    private BillSamplingMapper samplingMapper;
    @Autowired
    private BillDryMapper dryMapper;


    @Override
    public Result listPersonalCleanBefore(HttpServletRequest httpServletRequest, Map<String, String> paramsMap) {
        String farmId = paramsMap.get("farmId");
        String pageNo = paramsMap.get("pageNum");
        String pageSize = paramsMap.get("pageSize");
        String vistitType = paramsMap.get("vistitType");
        Integer userId = TokenSign.getMemberIdByJwtToken(httpServletRequest);
        Page<BillCleanBefore> page = new Page<>(Integer.parseInt(pageNo), Integer.parseInt(pageSize));
        LambdaQueryWrapper<BillCleanBefore> queryWrapper = new QueryWrapper<BillCleanBefore>().lambda()
                .eq(BillCleanBefore::getFarmId, farmId)
                .eq(BillCleanBefore::getAdmissionUserId, userId)
                .eq(ObjectUtil.isNotEmpty(vistitType), BillCleanBefore::getVistitType, vistitType)
                .orderByDesc(BillCleanBefore::getSubDate);
        Page<BillCleanBefore> billCleanBeforePage = billCleanBeforeMapper.selectPage(page, queryWrapper);
        Integer count = billCleanBeforeMapper.selectCount(queryWrapper);
        return new Result(ResultCode.SUCCESS, billCleanBeforePage, count);
    }

    @Override
    public Result edit(HttpServletRequest httpServletRequest, String farmId, String id, String date, MultipartFile img) throws ParseException, IOException {
        String s = "";
        if (uploadImage.getImageCom(img).equals("上传失败")) {
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return new Result(10001, "图片1上传失败", false);
        }
        s = uploadImage.uploadImg(img);

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");

        if (StringUtils.isBlank(date)) {
            date = sdf.format(new Date());
        }
        BillCleanBefore cleanBefore = billCleanBeforeMapper.selectById(id);
        cleanBefore.setImgUrl(s);
        cleanBefore.setImgStatus(1);


        QueryWrapper<BaseProcess> processQueryWrapper = new QueryWrapper<>();
        processQueryWrapper.eq("farm_id", farmId).eq("id", cleanBefore.getProcessId());
        BaseProcess baseProcess = processMapper.selectOne(processQueryWrapper);//进程

        QueryWrapper<BaseLocation> locationQueryWrapper = new QueryWrapper<>();
        locationQueryWrapper.eq("id", cleanBefore.getTestLocationId());
        BaseLocation baseLocation = locationMapper.selectOne(locationQueryWrapper);//当前pcr检测所在的位置

        String allLocationId = baseProcess.getAllLocationId();//所有的位置id
        String allFlowId = baseProcess.getAllFlowId();//所有的流程id
        String currentFlowId = baseProcess.getCurrentFlowId();//当前已经完成的流程id
        String substring1 = allFlowId.substring(currentFlowId.length() + 1, allFlowId.length());
        String[] split = substring1.split(",");
        Integer nextId = Integer.parseInt(split[0]);


        cleanBefore.setBillStatus(1);
        cleanBefore.setPassUserName(TokenSign.getUserNameByJwtToken(httpServletRequest));
        cleanBefore.setPassUserId(TokenSign.getMemberIdByJwtToken(httpServletRequest));
        cleanBefore.setTestLocation(baseLocation.getLocationName());
        cleanBefore.setTestLocationId(baseLocation.getId());
        cleanBefore.setCheckDate(LocalDateTime.parse(date));
        cleanBefore.setPassDate(LocalDateTime.now());


        Object newObject = BillPcrServiceImpl.getNewObject(nextId, cleanBefore.getDestName(), cleanBefore.getDestId(), cleanBefore.getAdmissionUserName(),
                cleanBefore.getAdmissionUserId(), cleanBefore.getVistitDate(), cleanBefore.getSubDate(),
                cleanBefore.getProcessId(), Integer.parseInt(cleanBefore.getFarmId()), cleanBefore.getTestLocation(), cleanBefore.getTestLocationId(),
                cleanBefore.getVistitType(), cleanBefore.getPhone());
        if (nextId == 0) {
            int index = allLocationId.indexOf(baseLocation.getId());
            StringBuilder status = new StringBuilder(baseProcess.getAllLocationId());
            status.setCharAt(index, '1');
            status.setCharAt(index + 2, '1');
            baseProcess.setAllLocationStatus(status.toString());
        } else if (nextId == 1) {
            //新增采样
            BillSampling billSampling = (BillSampling) newObject;
            samplingMapper.insert(billSampling);
        } else if (nextId == 2) {
            //新增pcr
            BillPcr billClean = (BillPcr) newObject;
            pcrMapper.insert(billClean);
        } else if (nextId == 3) {
            //新增洗澡
            BillClean billClean = (BillClean) newObject;
            cleanMapper.insert(billClean);
        } else if (nextId == 4) {
            //新增隔离
            BillIsolate pcr = (BillIsolate) newObject;
            isolateMapper.insert(pcr);
        } else if (nextId == 5) {
            BillDry billClean = (BillDry) newObject;
            dryMapper.insert(billClean);
            //新增烘干
        } else if (nextId == 6) {
            //新增洗澡前拍照
            BillCleanBefore before = new BillCleanBefore();
            billCleanBeforeMapper.insert(before);
        }
        baseProcess.setUpdateDate(baseProcess.getUpdateDate() + "," + sdf.format(new Date()));
        baseProcess.setCurrentLocation(baseProcess.getCurrentLocation() + "," + baseLocation.getLocationName());
        baseProcess.setCurrentLocationId(baseProcess.getCurrentLocationId() + "," + baseLocation.getId());
        String status = baseProcess.getCurrentStatus();
        String substring = status.substring(0, status.length() - 1);

        baseProcess.setCurrentStatus(substring + "1," + 0);
        baseProcess.setCurrentFlowId(baseProcess.getCurrentLocationId() + "," + nextId);
        processMapper.updateById(baseProcess);
        billCleanBeforeMapper.updateById(cleanBefore);
        return new Result(10000, "修改成功！", true);
    }
}
