package com.huaheng.pc.srm.service;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.huaheng.api.srm.domain.*;
import com.huaheng.common.constant.QuantityConstant;
import com.huaheng.common.exception.RunFailException;
import com.huaheng.common.exception.service.ServiceException;
import com.huaheng.common.utils.StringUtils;
import com.huaheng.common.utils.Wrappers;
import com.huaheng.common.utils.http.OkHttpUtils;
import com.huaheng.framework.web.domain.AjaxResult;
import com.huaheng.pc.config.address.domain.Address;
import com.huaheng.pc.config.address.service.AddressService;
import com.huaheng.pc.config.company.domain.CompanyU8;
import com.huaheng.pc.config.company.service.CompanyU8Service;
import com.huaheng.pc.config.material.domain.Material;
import com.huaheng.pc.config.material.service.MaterialService;
import com.huaheng.pc.config.supplier.service.SupplierService;
import com.huaheng.pc.monitor.apilog.domain.ApiLog;
import com.huaheng.pc.srm.domain.*;
import com.huaheng.pc.srm.mapper.ICSASNMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class ICSASNService extends ServiceImpl<ICSASNMapper, ICSASN> {

    private static final Logger logger = LoggerFactory.getLogger(ICSASNService.class);

    @Resource
    private ICSASNService icsasnService;
    @Resource
    private ICSASNDetailService icsasnDetailService;
    @Resource
    RunFailException runFailException;
    @Resource
    SupplierService supplierService;
    @Resource
    private MaterialService materialService;
    @Resource
    private SrmHeaderService srmHeaderService;
    @Resource
    private SrmDetailService srmDetailService;
    @Resource
    private ICSITEMLotService icsitemLotService;
    @Resource
    private AddressService addressService;
    @Resource
    private CompanyU8Service companyU8Service;


    public List<ICSASN> selectListEntity(ICSASN icsasn) {
        LambdaQueryWrapper<ICSASN> queryWrapper = Wrappers.lambdaQuery();
        queryWrapper.eq(StringUtils.isNotEmpty(icsasn.getSTNO()), ICSASN::getSTNO, icsasn.getSTNO());
        queryWrapper.eq(StringUtils.isNotEmpty(icsasn.getWarehouseCode()), ICSASN::getWarehouseCode, icsasn.getWarehouseCode());
        return this.list(queryWrapper);
    }

    public List<ICSASN> selectBySTNO(List<String> STNOS) {
        if (STNOS != null && STNOS.size() > 0) {
            String[] split = STNOS.toArray(new String[0]);
            LambdaQueryWrapper<ICSASN> queryWrapper = Wrappers.lambdaQuery();
            queryWrapper.in(ICSASN::getSTNO, split);
            return this.list(queryWrapper);
        }
        return null;
    }


    public boolean update(ICSASN icsasn) {
        return this.update(icsasn);
    }

    /**
     * 接收送货单信息
     *
     * @param icsOrder
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    public SRMResult saveASNAndDetail(ICSOrder icsOrder) {
        SRMResult srmResult = new SRMResult();
        ICSASN icsasn = icsOrder.getIcsasn();
        //1、判断货主(账套号)
        if (StringUtils.isEmpty((icsasn.getCompanyCode()))) {
            return srmResult.error("账套号为空");
        }
        if (StringUtils.isEmpty((icsasn.getWarehouseCode()))) {
            return srmResult.error("仓库code为空");
        }
        CompanyU8 companyWu = companyU8Service.getOne(new LambdaQueryWrapper<CompanyU8>()
                .eq(CompanyU8::getWarehouseCode, icsasn.getWarehouseCode())
                .like(CompanyU8::getUCompanyCode, icsasn.getCompanyCode())
                .last("order by id asc limit 1")
        );
        if (companyWu == null) {
            return srmResult.error(icsasn.getCompanyCode() + "账套号不存在");
        }
        //2、判断供应商是否存在
        String supplierName = supplierService.getSuppierNameByCode(icsasn.getVENDORCODE(), icsasn.getWarehouseCode());
        if (supplierName == null) {
            runFailException.sendException("头表ID为:" + icsasn.getID() + "的送货单供应商在wms不存在");
            return srmResult.error("头表ID为:" + icsasn.getID() + "的送货单供应商在wms不存在");
        }
        //3、操作头表icsasn和srmHeader
        Integer headerId = null;
        ICSASN queryHeaderEntry = new ICSASN();
        queryHeaderEntry.setSTNO(icsasn.getSTNO());
        queryHeaderEntry.setWarehouseCode(icsasn.getWarehouseCode());
        if (this.selectListEntity(queryHeaderEntry).size() > 0) {
            //①判断送货单头表是否存在,已存在,则更新
            if (!this.updateById(icsasn)) {
                runFailException.sendException("更新送货单头表失败,头表ID为:" + icsasn.getID());
                return srmResult.error("更新送货单头表失败,头表ID为:" + icsasn.getID());
            }
            SrmHeader srmHeader = new SrmHeader();
            srmHeader.setCode(icsasn.getSTNO());
            srmHeader.setWarehouseCode(icsasn.getWarehouseCode());
            srmHeader = srmHeaderService.selectFirstModel(srmHeader);
            SrmHeader model = this.getSrmHeader(icsasn);
            model.setId(srmHeader.getId());
            srmHeaderService.updateById(model);
            headerId = srmHeader.getId();
        } else {
            //②判断送货单头表是否存在,不存在,则插入
            if (!this.save(icsasn)) {
                runFailException.sendException("插入送货单头表失败,头表ID为:" + icsasn.getID());
                return srmResult.error("插入送货单头表失败,头表ID为:" + icsasn.getID());
            }
            SrmHeader model = this.getSrmHeader(icsasn);
            srmHeaderService.save(model);
            SrmHeader srmHeader = new SrmHeader();
            srmHeader.setCode(model.getCode());
            srmHeader = srmHeaderService.selectFirstModel(srmHeader);
            headerId = srmHeader.getId();
        }
        //3、操作明细表icsasndetail和srmDetail
        if (icsOrder.getIcsasnDetailList().size() > 0) {
            //①icsasnDetail添加物料信息
            for (ICSASNDetail icsasnDetail : icsOrder.getIcsasnDetailList()) {
                //查询SRM有没有推送物料条码
                ICSITEMLot queryIcsitemLot = new ICSITEMLot();
                queryIcsitemLot.setLotNO(icsasnDetail.getLOTNO());
                queryIcsitemLot.setWarehouseCode(icsasn.getWarehouseCode());
                ICSITEMLot icsitemLot = icsitemLotService.selectFirstModel(queryIcsitemLot);
                if (icsitemLot == null) {
                    runFailException.sendException("ID为:" + icsasnDetail.getID() + "的物料条码没有同步到wms");
                    return srmResult.error("ID为:" + icsasnDetail.getID() + "的物料条码没有同步到wms");
                }
                Material material = materialService.getMaterialByCode(icsitemLot.getItemCode(), icsasn.getWarehouseCode());
                if (material == null) {
                    runFailException.sendException("ID为:" + icsasnDetail.getID() + "的物料条码在wms不存在");
                    return srmResult.error("ID为:" + icsasnDetail.getID() + "的物料条码在wms不存在");
                }
                icsasnDetail.setMaterialCode(material.getCode());
                icsasnDetail.setMaterialName(material.getName());
                icsasnDetail.setSpec(material.getSpec());
                icsasnDetail.setWarehouseCode(material.getWarehouseCode());
            }
            //②查询送货单号STNO是否存在明细
            ICSASNDetail queryDetailEntry = new ICSASNDetail();
            queryDetailEntry.setSTNO(icsasn.getSTNO());
            queryDetailEntry.setWarehouseCode(icsasn.getWarehouseCode());
            List<ICSASNDetail> icsasnDetailList = icsasnDetailService.selectListEntity(queryDetailEntry);
            if (icsasnDetailList.size() > 0) {
                //③送货单号STNO已存在的明细进行更新
                for (ICSASNDetail icsasnDetail : icsOrder.getIcsasnDetailList()) {
                    queryDetailEntry.setID(icsasnDetail.getID());
                    queryDetailEntry.setWarehouseCode(icsasnDetail.getWarehouseCode());
                    if (icsasnDetailService.selectListEntity(queryDetailEntry).size() > 0) {
                        if (!icsasnDetailService.updateById(icsasnDetail)) {
                            runFailException.sendException("更新送货单明细失败,头表ID为:" + icsasnDetail.getID());
                            return srmResult.error("更新送货单明细失败,头表ID为:" + icsasnDetail.getID());
                        }
                        SrmDetail srmDetail = new SrmDetail();
                        srmDetail.setMark(icsasnDetail.getID());
                        srmDetail.setWarehouseCode(icsasnDetail.getWarehouseCode());
                        srmDetail = srmDetailService.selectFirstModel(srmDetail);
                        SrmDetail model = this.getSrmDetail(icsasnDetail, srmDetail.getHeaderId(), companyWu);
                        model.setId(srmDetail.getId());
                        srmDetailService.updateById(model);
                    } else {
                        if (!icsasnDetailService.save(icsasnDetail)) {
                            runFailException.sendException("插入送货单明细失败,头表ID为:" + icsasnDetail.getID());
                            return srmResult.error("插入送货单明细失败,头表ID为:" + icsasnDetail.getID());
                        }
                        SrmDetail srmDetail = this.getSrmDetail(icsasnDetail, headerId, companyWu);
                        srmDetailService.save(srmDetail);
                    }
                }
            } else {
                //④送货单号STNO不存在的明细进行新增
                for (ICSASNDetail icsasnDetail : icsOrder.getIcsasnDetailList()) {
                    if (icsasnDetail.getSTNO().equals(icsasn.getSTNO())) {
                        if (!icsasnDetailService.save(icsasnDetail)) {
                            runFailException.sendException("插入送货单明细失败,头表ID为:" + icsasnDetail.getID());
                            return srmResult.error("插入送货单明细失败,头表ID为:" + icsasnDetail.getID());
                        }
                        SrmDetail srmDetail = this.getSrmDetail(icsasnDetail, headerId, companyWu);
                        srmDetailService.save(srmDetail);
                    }
                }
            }
        }

        return srmResult.success("送货单列表推送成功");
    }


    public SrmHeader getSrmHeader(ICSASN icsasn) {
        SrmHeader srmHeader = new SrmHeader();
        srmHeader.setCode(icsasn.getSTNO());
        srmHeader.setMark(icsasn.getID());
        srmHeader.setSupplierCode(icsasn.getVENDORCODE());
        srmHeader.setOperator(icsasn.getMUSERName());
        srmHeader.setOperatorTime(icsasn.getMTIME());
        srmHeader.setCreated(new Date());
        srmHeader.setWarehouseCode(icsasn.getWarehouseCode());
        return srmHeader;

    }

    public SrmDetail getSrmDetail(ICSASNDetail icsasnDetail, Integer headerId, CompanyU8 companyWu) {
        SrmDetail srmDetail = new SrmDetail();
        srmDetail.setHeaderId(headerId);
        srmDetail.setCode(icsasnDetail.getSTNO());
        srmDetail.setCompanyCode(companyWu.getUCompanyCode());
        srmDetail.setMark(icsasnDetail.getID());
        srmDetail.setLineCode(icsasnDetail.getLOTNO());
        srmDetail.setMaterialCode(icsasnDetail.getMaterialCode());
        srmDetail.setMaterialName(icsasnDetail.getMaterialName());
        srmDetail.setSpecification(icsasnDetail.getSpec());
        srmDetail.setQty(icsasnDetail.getPLANQTY());
        srmDetail.setConfirmQty(icsasnDetail.getRECEIVEQTY());
        srmDetail.setOperator(icsasnDetail.getMUSERName());
        srmDetail.setOperatorTime(icsasnDetail.getMTIME());
        srmDetail.setCreated(new Date());
        srmDetail.setWarehouseCode(icsasnDetail.getWarehouseCode());
        srmDetail.setProductionBatch(icsasnDetail.getCdefine22());
        srmDetail.setBatchNumberContent(icsasnDetail.getCdefine23());
        return srmDetail;
    }


    public Address getSRMAddress(String warehouseCode) {
        Address address = new Address();
        address.setParam("SRM");
        address.setWarehouseCode(warehouseCode);
        address = addressService.selectEntity(address);
        return address;
    }


    @Transactional
    public SRMResult sendReturn(String url, String json, String warehouseCode) {
        if (StringUtils.isEmpty(warehouseCode)) {
            warehouseCode = "CS0001";
        }
        SRMResult ajaxResult = new SRMResult();
        String msg = "";
        ApiLog log = null;
        HttpHeaders headers = new HttpHeaders();
//        try {
//            log = ApiLogAspect.initApiLog("post", url,
//                    json, headers, warehouseCode);
//            log.setWarehouseCode(warehouseCode);
            String result = OkHttpUtils.bodypost(url, json, warehouseCode);
            if (StringUtils.isEmpty(result)) {
                return new SRMResult().error("接口地址错误或服务器连接不到或返回为空");
//                throw new ServiceException("接口地址错误或服务器连接不到或返回为空");
            }
            ajaxResult = JSON.parseObject(result, SRMResult.class);
//        } catch (Exception e) {
//            e.printStackTrace();
////            ApiLogAspect.setApiLogException(log, e);
//        } finally {
////            ApiLogAspect.finishApiLog(log, headers, msg);
//        }
        return ajaxResult;
    }


    //采购到货单返回
    public AjaxResult returnICSPOArrive(List<ICSPOArrive> icspoArrives, String warehouseCode) {
        String json = JSON.toJSONString(icspoArrives);
//        logger.info("WMS送货单确认回传:{}", json);
        Address address = this.getSRMAddress(warehouseCode);
        if (address == null) {
            return AjaxResult.error("未配置SRM API地址");
        }
        String url = address.getUrl() + "POArrive";
        String JsonParam = JSON.toJSONString(icspoArrives);
        logger.info("WMS送货单提交SRM:{}", JsonParam);
        SRMResult srmResult = this.sendReturn(url, JsonParam, warehouseCode);
        logger.info("SRM送货单返回信息:{}", srmResult);
        if (!srmResult.hasError()) {
            return AjaxResult.success(srmResult.getData());
        } else {
            logger.info("SRM采购到货单回传:{}", srmResult.getMessage());
            return AjaxResult.error(srmResult.getMessage());
        }
    }

    //质检返回
    public AjaxResult returnICSinspection(List<ICSinspection> icSinspections, String warehouseCode) {
        String json = JSON.toJSONString(icSinspections);
        logger.info("WMS质检信息回传:{}", json);
        Address address = this.getSRMAddress(warehouseCode);
        if (address == null) {
            return AjaxResult.error("未配置SRM API地址");
        }

        String url = address.getUrl() + "POTest";

        String JsonParam = JSON.toJSONString(icSinspections);
        SRMResult srmResult = this.sendReturn(url, JsonParam, warehouseCode);
        if (!srmResult.hasError()) {
            return AjaxResult.success("成功");
        } else {
            logger.info("SRM质检返回信息:{}", srmResult.getMessage());
            return AjaxResult.error(srmResult.getMessage());
        }
    }


    //入库返回
    public AjaxResult returnICSRuternASN(List<ICSRuternASN> icsRuternASNs, String warehouseCode) {
        String json = JSON.toJSONString(icsRuternASNs);
        logger.info("WMS入库回传:{}", json);
        Address address = this.getSRMAddress(warehouseCode);
        if (address == null) {
            return AjaxResult.error("未配置SRM API地址");
        }

        String url = address.getUrl() + "WareHouseLotInfo";
        String JsonParam = JSON.toJSONString(icsRuternASNs);
        SRMResult srmResult = this.sendReturn(url, JsonParam, warehouseCode);
        if (!srmResult.hasError()) {
            return AjaxResult.success("成功");
        } else {
            logger.info("SRM入库返回信息:{}", srmResult.getMessage());
            return AjaxResult.error(srmResult.getMessage());
        }
    }


    @Transactional
    public AjaxResult delASNAndDetail(List<ICSASN> list) {
        SRMResult srmResult = new SRMResult();
        if (list.isEmpty()) {
            return AjaxResult.error("请勿提交空数据!");
        }

        List<String> STNOS = list.stream().map(ICSASN::getSTNO).collect(Collectors.toList());
        if (STNOS.size() == 0) {
            return AjaxResult.error("送货单号不能为空值!");
        }
        List<String> warehouseCodes = list.stream().map(ICSASN::getWarehouseCode).collect(Collectors.toList());
        if (warehouseCodes.size() == 0) {
            return AjaxResult.error("仓库code不能为空值!");
        }
        // 查询送货单头表
        List<ICSASN> icsasnList = selectBySTNO(STNOS);
        // 差未到送货单头表
        List<SrmHeader> srmHeaderList = srmHeaderService.selectBySTNO(STNOS);
        if (srmHeaderList.size() == 0 || icsasnList.size() == 0) {
            return AjaxResult.success("未查询到送货单信息,请检查送货单号是否正确!");
        }
        for (SrmHeader header : srmHeaderList) {
            // 不是未到货单不允许删除
            if (!QuantityConstant.NO_THE_ARRIVAL.equals(header.getEnable())) {
                return AjaxResult.error("送货单号:" + header.getCode() + "单据已执行不允许删除!");
            }
        }
        // 查询送货单详情表
        List<ICSASNDetail> icsasnDetailList = icsasnDetailService.selectBySTNO(STNOS);
        List<SrmDetail> srmDetailList = srmDetailService.selectBySTNO(STNOS);
        if (icsasnList.size() == srmHeaderList.size() && icsasnDetailList.size() == srmDetailList.size()) {
            try {
                this.removeByIds(icsasnList.stream().map(ICSASN::getID).collect(Collectors.toList()));
                icsasnDetailService.removeByIds(icsasnDetailList.stream().map(ICSASNDetail::getID).collect(Collectors.toList()));
                srmHeaderService.removeByIds(srmHeaderList.stream().map(SrmHeader::getId).collect(Collectors.toList()));
                srmDetailService.removeByIds(srmDetailList.stream().map(SrmDetail::getId).collect(Collectors.toList()));
            } catch (Exception e) {
                // 删除失败事务回滚
                e.printStackTrace();
                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                return AjaxResult.error("系统异常:" + e.getMessage());
            }

        } else {
            return AjaxResult.error("送货单数据条目不匹配,请检查数据是否正常!");
        }

        return AjaxResult.success("送货单删除成功!");
    }
}