package com.huimv.admin.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.huimv.admin.common.token.TokenSign;
import com.huimv.admin.common.utils.Result;
import com.huimv.admin.common.utils.ResultCode;
import com.huimv.admin.entity.*;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.huimv.admin.common.token.TokenSign;
import com.huimv.admin.common.utils.Result;
import com.huimv.admin.common.utils.ResultCode;
import com.huimv.admin.mapper.*;
import com.huimv.admin.service.IBillPcrService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletRequest;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * <p>
 * pcr 表 服务实现类
 * </p>
 *
 * @author author
 * @since 2023-07-21
 */
@Service
public class BillPcrServiceImpl extends ServiceImpl<BillPcrMapper, BillPcr> implements IBillPcrService {

    @Resource
    private BillPcrMapper billPcrMapper;

    @Override
    public Result listPersonalPcr(HttpServletRequest httpServletRequest, Map<String, String> paramsMap) {
        String pageNo = paramsMap.get("pageNum");
        String pageSize = paramsMap.get("pageSize");
        String vistitType = paramsMap.get("vistitType");
        Page<BillPcr> page = new Page<>(Integer.parseInt(pageNo), Integer.parseInt(pageSize));
        Page<BillPcr> billPcrPage = billPcrMapper.selectPage(page, new QueryWrapper<BillPcr>().eq(StringUtils.isNotBlank(vistitType),"vistit_type",vistitType).eq("admission_user_id", TokenSign.getMemberIdByJwtToken(httpServletRequest)).orderByDesc("sub_date"));
        QueryWrapper<BillPcr> queryWrapper=new QueryWrapper<>();
        queryWrapper.eq(StringUtils.isNotBlank(vistitType),"vistit_type",vistitType).eq("admission_user_id", TokenSign.getMemberIdByJwtToken(httpServletRequest)).orderByDesc("sub_date");
        return new Result(ResultCode.SUCCESS, billPcrPage,billPcrMapper.selectCount(queryWrapper));
    }

    @Autowired
    private BillPcrMapper pcrMapper;
    @Autowired
    private BaseProcessMapper processMapper;
    @Autowired
    private BaseLocationMapper locationMapper;
    @Autowired
    private BillCleanMapper cleanMapper;
    @Autowired
    private BillGoodsInventoryMapper goodsInventoryMapper;

    @Override
    public Result list(HttpServletRequest httpServletRequest, Map<String, String> paramsMap) {
        String farmId = paramsMap.get("farmId");
        String type = paramsMap.get("type");//展示类型
        String pageNum = paramsMap.get("pageNum");
        String pageSize = paramsMap.get("pageSize");
        if ("".equals(pageNum) || null == pageNum) {
            pageNum = "1";
        }
        if ("".equals(pageSize) || null == pageSize) {
            pageSize = "20";
        }
        Page<BillPcr> page = new Page<>(Integer.parseInt(pageNum), Integer.parseInt(pageSize));
        QueryWrapper<BaseLocation> queryWrapper1 = new QueryWrapper<>();
        queryWrapper1.eq("farm_id", farmId).eq("location_type", TokenSign.getWorkIdByJwtToken(httpServletRequest));
        List<BaseLocation> baseLocations = locationMapper.selectList(queryWrapper1);
        List<Integer> ids = new ArrayList<>();
        for (BaseLocation baseLocation : baseLocations) {
            ids.add(baseLocation.getId());
        }
        QueryWrapper<BillPcr> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("farm_id", farmId).in("test_location_id", ids).orderByDesc("sub_date");
        if ("0".equals(type)) {
            queryWrapper.in("bill_status", 0, 1, 2, 3);
        }
        if ("1".equals(type)) {
            queryWrapper.eq("bill_status", 0);
        }
        if ("2".equals(type)) {
            queryWrapper.eq("bill_status", 1);
        }
        if ("3".equals(type)) {
            queryWrapper.in("bill_status", 2, 3);
        }
        QueryWrapper<BillPcr> queryWrapper2 = new QueryWrapper<>();
        queryWrapper2.eq("farm_id", farmId).in("test_location_id", ids).orderByDesc("sub_date");
        queryWrapper2.eq("bill_status", 0);
        return new Result(ResultCode.SUCCESS, pcrMapper.selectPage(page, queryWrapper),pcrMapper.selectCount(queryWrapper2));
    }

    @Override
    public Result listById(HttpServletRequest httpServletRequest, Map<String, String> paramsMap) {
        String id = paramsMap.get("id");
        BillPcr billPcr = pcrMapper.selectById(id);
        return new Result(ResultCode.SUCCESS, billPcr);
    }

    @Override
    public Result edit(HttpServletRequest httpServletRequest, Map<String, String> paramsMap) throws ParseException {
        String result = paramsMap.get("result");//1为合格2为异常
        String id = paramsMap.get("id");
        String farmId = paramsMap.get("farmId");
        String date = paramsMap.get("date");

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

        if (StringUtils.isBlank(date)) {
            date = sdf.format(new Date());
        }
        BillPcr billPcr = pcrMapper.selectById(id);

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

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


        if (baseProcess.getProcessType() == 2 || baseProcess.getProcessType() == 1) {
            return new Result(10001, "修改失败！该申请已提前结束或者被拒绝", false);
        } else {
            if (billPcr.getDestId() >= billPcr.getTestLocationId()||billPcr.getTestLocationId()==9||billPcr.getTestLocationId()==10||billPcr.getTestLocationId()==11) { //说明当前不是目的地
                if ("1".equals(result)) {
                    billPcr.setBillStatus(1);
                    billPcr.setPassUserName(TokenSign.getUserNameByJwtToken(httpServletRequest));
                    billPcr.setPassUserId(TokenSign.getMemberIdByJwtToken(httpServletRequest));
                    billPcr.setTestLocation(baseLocation.getLocationName());
                    billPcr.setTestLocationId(baseLocation.getId());
                    billPcr.setCheckDate(sdf.parse(date));
                    billPcr.setPassDate(sdf.parse(sdf.format(new Date())));
                    billPcr.setQualifiedDate("2小时");


                    //通过生成洗消记录
                    BillClean billClean = new BillClean();
                    billClean.setVistitType(billPcr.getVistitType());
                    billClean.setDestName(billPcr.getDestName());
                    billClean.setDestId(billPcr.getDestId());
                    billClean.setAdmissionUserName(billPcr.getAdmissionUserName());
                    billClean.setAdmissionUserId(billPcr.getAdmissionUserId());
                    billClean.setVistitDate(billPcr.getVistitDate());
                    billClean.setSubDate(LocalDateTime.now());
                    billClean.setFarmId(billPcr.getFarmId());
                    billClean.setPassUserName(billPcr.getPassUserName());
                    billClean.setPassDate(billPcr.getPassDate());
                    billClean.setPassUserId(billPcr.getPassUserId());
                    billClean.setProcessId(billPcr.getProcessId());
                    billClean.setTestLocation(baseLocation.getLocationName());
                    billClean.setTestLocationId(baseLocation.getId());
                    billClean.setPhone(billPcr.getPhone());
                    billClean.setImgStatus(0);
                    billClean.setCarNum(billPcr.getCarNum());
                    cleanMapper.insert(billClean);

                    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);

                    processMapper.updateById(baseProcess);
                    pcrMapper.updateById(billPcr);
                    ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(10);
                    Runnable task = new Runnable() {
                        @Override
                        public void run() {
                            //这里写业务
                            billPcr.setBillStatus(3);
                            pcrMapper.updateById(billPcr);
                        }
                    };
                    // 设定延迟时间（两小时后执行，单位为秒）
                    long delay = 60 * 60 * 2;
                    // 执行定时任务
                    scheduler.schedule(task, delay, TimeUnit.SECONDS);
                    return new Result(10000, "修改成功！", true);
                } else {

                    billPcr.setBillStatus(2);
                    billPcr.setPassUserName(TokenSign.getUserNameByJwtToken(httpServletRequest));
                    billPcr.setPassUserId(TokenSign.getMemberIdByJwtToken(httpServletRequest));

                    billPcr.setTestLocation(baseLocation.getLocationName());
                    billPcr.setTestLocationId(baseLocation.getId());
                    billPcr.setCheckDate(sdf.parse(date));
                    billPcr.setPassDate(sdf.parse(sdf.format(new Date())));
                    baseProcess.setUpdateDate(baseProcess.getUpdateDate() + "," + sdf.format(new Date()));

                    String status = baseProcess.getCurrentStatus();
                    String substring = status.substring(0, status.length() - 1);

                    baseProcess.setCurrentStatus(substring + "2," + 0);
                    if (baseLocation.getId() == 1) {
                        //第一次检测不合格
                        billPcr.setPcrType(1);
                        baseProcess.setCurrentLocation(baseProcess.getCurrentLocation() + ",初级洗消站污区");
                        baseProcess.setCurrentLocationId(baseProcess.getCurrentLocationId() + ",2");
                    }
                    if (baseLocation.getId() == 12) {
                        //环保车第一次不合格
                        billPcr.setPcrType(1);
                        baseProcess.setCurrentLocation(baseProcess.getCurrentLocation() + ",销售中转站");
                        baseProcess.setCurrentLocationId(baseProcess.getCurrentLocationId() + ",2");
                    }
                    if (baseLocation.getId() == 15) {
                        //拉猪车第一次不合格
                        billPcr.setPcrType(1);
                        baseProcess.setCurrentLocation(baseProcess.getCurrentLocation() + ",销售中转站");
                        baseProcess.setCurrentLocationId(baseProcess.getCurrentLocationId() + ",2");
                    }
                    if (baseLocation.getId() == 6) {
                        //饲料车第一次不合格
                        billPcr.setPcrType(1);
                        baseProcess.setCurrentLocation(baseProcess.getCurrentLocation() + ",车辆初级洗消站");
                        baseProcess.setCurrentLocationId(baseProcess.getCurrentLocationId() + ",2");
                    }
                    if (baseLocation.getId() == 3) {
                        //第二次检测不合格
                        baseProcess.setProcessType(2);
                        baseProcess.setCurrentLocation(baseProcess.getCurrentLocation());
                        baseProcess.setCurrentLocationId(baseProcess.getCurrentLocationId());
                    }
                    if (baseLocation.getId() == 4) {
                        //第三次不合格
                        baseProcess.setProcessType(2);
                        baseProcess.setCurrentLocation(baseProcess.getCurrentLocation());
                        baseProcess.setCurrentLocationId(baseProcess.getCurrentLocationId());
                    }

                    processMapper.updateById(baseProcess);
                    pcrMapper.updateById(billPcr);
                    return new Result(10000, "修改成功！", true);
                }
            } else {

                if ("1".equals(result)) {
                    billPcr.setBillStatus(1);
                    billPcr.setPassUserName(TokenSign.getUserNameByJwtToken(httpServletRequest));
                    billPcr.setPassUserId(TokenSign.getMemberIdByJwtToken(httpServletRequest));
                    billPcr.setTestLocation(baseLocation.getLocationName());
                    billPcr.setTestLocationId(baseLocation.getId());
                    billPcr.setQualifiedDate("2小时");
                    billPcr.setCheckDate(sdf.parse(date));
                    billPcr.setPassDate(sdf.parse(sdf.format(new Date())));

                    baseProcess.setUpdateDate(baseProcess.getUpdateDate() + "," + sdf.format(new Date()));
                    baseProcess.setCurrentLocation(baseProcess.getCurrentLocation());
                    baseProcess.setCurrentLocationId(baseProcess.getCurrentLocationId());
                    String status = baseProcess.getCurrentStatus();
                    String substring = status.substring(0, status.length() - 1);
                    baseProcess.setCurrentStatus(substring + "1");
                    baseProcess.setProcessType(1);
                    processMapper.updateById(baseProcess);
                    pcrMapper.updateById(billPcr);
                    ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(10);
                    Runnable task = new Runnable() {
                        @Override
                        public void run() {
                            //这里写业务
                            billPcr.setBillStatus(3);
                            pcrMapper.updateById(billPcr);
                        }
                    };
                    // 设定延迟时间（两小时后执行，单位为秒）
                    long delay = 60 * 60 * 2;
                    // 执行定时任务
                    scheduler.schedule(task, delay, TimeUnit.SECONDS);
                    return new Result(10000, "修改成功！", true);
                } else {
                    if (baseLocation.getId() == 1) {
                        //第一次检测不合格
                        billPcr.setPcrType(1);
                        baseProcess.setProcessType(2);
                    } else if (baseLocation.getId() == 12) {
                        //环保车检测不合格
                        billPcr.setPcrType(1);
                        baseProcess.setProcessType(2);
                    } else if (baseLocation.getId() == 15) {
                        //拉猪车检测不合格
                        billPcr.setPcrType(1);
                        baseProcess.setProcessType(2);
                    } else if (baseLocation.getId() == 6) {
                        //饲料车检测不合格
                        billPcr.setPcrType(1);
                        baseProcess.setProcessType(2);
                    } else {
                        baseProcess.setUpdateDate(baseProcess.getUpdateDate() + "," + sdf.format(new Date()));
                        baseProcess.setProcessType(2);
                    }
                    baseProcess.setUpdateDate(baseProcess.getUpdateDate() + "," + sdf.format(new Date()));
                    baseProcess.setCurrentLocation(baseProcess.getCurrentLocation());
                    baseProcess.setCurrentLocationId(baseProcess.getCurrentLocationId());
                    String status = baseProcess.getCurrentStatus();
                    String substring = status.substring(0, status.length() - 1);
                    baseProcess.setCurrentStatus(substring + "2," + 0);

                    billPcr.setBillStatus(2);
                    billPcr.setPassUserName(TokenSign.getUserNameByJwtToken(httpServletRequest));
                    billPcr.setPassUserId(TokenSign.getMemberIdByJwtToken(httpServletRequest));
                    billPcr.setTestLocation(baseLocation.getLocationName());
                    billPcr.setTestLocationId(baseLocation.getId());
                    billPcr.setCheckDate(sdf.parse(date));
                    billPcr.setPassDate(sdf.parse(sdf.format(new Date())));
                    processMapper.updateById(baseProcess);
                    pcrMapper.updateById(billPcr);
                    return new Result(10000, "修改成功！", true);
                }

            }

        }

    }

    private void xiugaiPro(BaseProcess baseProcess, BillPcr billPcr) {
        baseProcess.setUpdateDate(baseProcess.getUpdateDate() + "," + new Date());
        baseProcess.setCurrentLocation(baseProcess.getCurrentLocation() + "," + billPcr.getTestLocation());
        baseProcess.setCurrentLocationId(baseProcess.getCurrentLocationId() + "," + billPcr.getTestLocationId());
        baseProcess.setCurrentStatus(baseProcess.getCurrentStatus() + "," + 2);
    }

    public String add() {
        ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(10);
        Runnable task = new Runnable() {
            @Override
            public void run() {

                //这里写业务
                System.out.println();
            }
        };

        // 设定延迟时间（两小时后执行，单位为秒）
        long delay = 3;

        // 执行定时任务
        scheduler.schedule(task, delay, TimeUnit.SECONDS);
        System.out.println("完结");
        return "成功";
    }
}
