package com.sunda.spmsoversea.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.sunda.spmscommon.ResponseResult;
import com.sunda.spmscommon.feign.IFeignServiceCommon;
import com.sunda.spmsoversea.dto.EamFormerSkuQueryDTO;
import com.sunda.spmsoversea.entity.EamFormerSku;
import com.sunda.spmsoversea.entity.EamFormerSkuDtl;
import com.sunda.spmsoversea.mapper.EamFormerSkuMapper;
import com.sunda.spmsoversea.mapper.WhsStorageInventoryMapper;
import com.sunda.spmsoversea.service.IEamFormerSkuDtlService;
import com.sunda.spmsoversea.service.IEamFormerSkuService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sunda.spmsoversea.service.IOverseaOperateLogService;
import com.sunda.spmsuser.service.ISpmsRoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;

/**
 * <p>
 * EAM旧件申请表 服务实现类
 * </p>
 *
 * @author Hzc
 * @since 2023-11-16
 */
@Service
public class EamFormerSkuServiceImpl extends ServiceImpl<EamFormerSkuMapper, EamFormerSku> implements IEamFormerSkuService {
    @Autowired
    ISpmsRoleService iSpmsRoleService;

    @Autowired
    IEamFormerSkuDtlService iEamFormerSkuDtlService;

    @Autowired
    WhsStorageInventoryMapper whsStorageInventoryMapper;

    @Autowired
    IOverseaOperateLogService iOverseaOperateLogService;

    @Autowired
    IFeignServiceCommon iFeignServiceCommon;
//
//    @Autowired
//    IOverseaOtherTaskService iOverseaOtherTaskService;
    @Override
    public IPage getEamFormerSkuPage(EamFormerSkuQueryDTO eamFormerSkuQueryDTO) {
        IPage iPage = eamFormerSkuQueryDTO.getPage();
        List<Map<String, Object>> mapList = this.baseMapper.getEamFormerSkuIPage(iPage, eamFormerSkuQueryDTO);
        iPage.setRecords(mapList);
        return iPage;
    }


    @Override
    public ResponseResult getRequisitionAndDtl(String uuidRequisition) {
        if (StringUtils.isEmpty(uuidRequisition)){
            return ResponseResult.error("请求参数不能为空");
        }
        List<Map<String, Object>> EamFormerSkuDtlList = iEamFormerSkuDtlService.getEamFormerSkuDtlList(uuidRequisition);
        List<Map<String, Object>> marmList = new ArrayList<Map<String, Object>>();
        if(EamFormerSkuDtlList!=null && EamFormerSkuDtlList.size()>0){
            List<String> materialNo = new ArrayList<String>();
            for (int i = 0; i < EamFormerSkuDtlList.size(); i++){
                materialNo.add(EamFormerSkuDtlList.get(i).get("materialNo").toString());
            }
            marmList = whsStorageInventoryMapper.getMaterialMarmByNo(materialNo);
        }

        return ResponseResult.success()
                .add("EamFormerSku", this.baseMapper.getEamFormerSku(uuidRequisition))
                .add("EamFormerSkuDtlList",EamFormerSkuDtlList )
                .add("marmList",marmList );
    }


    /**
     * 退库单在审批通过、已完成状态进行撤回操作，撤回状态为待审批
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public ResponseResult rollBackEamFormerSku(String uuidRequisition, Integer dataVersion, String userId,String cancelReason)throws Exception {
        if (StringUtils.isEmpty(uuidRequisition) || dataVersion == null){
            return ResponseResult.error("请求参数错误");
        }
        boolean updateInventory = true;
        QueryWrapper<EamFormerSku> queryWrapper = new QueryWrapper<EamFormerSku>().eq("UUID_REQUISITION", uuidRequisition);
        EamFormerSku eamFormerSku = this.baseMapper.selectOne(queryWrapper);
        if (eamFormerSku == null){
            return ResponseResult.error("请求旧件申请不存在");
        }
        if (eamFormerSku.getDataVersion() != dataVersion.intValue()){
            return ResponseResult.error("请求数据已更新，请刷新后重试");
        }
        if(eamFormerSku!=null && StringUtils.isNotEmpty(eamFormerSku.getRequestnum())){//退库单是EAM创建的
            updateInventory = false;
        }
        // 只有退库审批人才能撤回
//        List<Map<String, Object>> roleList = iSpmsRoleService.getRoleById(userId);
//        if (CollectionUtils.isEmpty(roleList)) {
//            return ResponseResult.error("只有退库审批人的权限才能撤回");
//        }
//        boolean flag = true;
//        for (Map<String, Object> map : roleList) {
//            if ("5002".equals(map.get("roleId")) || "领用审批人".equals(map.get("roleCnName"))) {
//                flag = false;
//            }
//        }
//        if (flag) {
//            return ResponseResult.error("只有退库审批人的权限才能撤回");
//        }

        // 判断是否生成出库单，如果是不能撤回
//        List<OverseaOtherTask> outList = iOverseaOtherTaskService.findListByRecord(EamFormerSku.getSpmsId());
//        if (CollectionUtils.isNotEmpty(outList)) {
//            boolean outFlag = false;
//            for (OverseaOtherTask out : outList) {
//                if (!OverseaOtherEnum.OTHER_CLOSE.getCode().equals(out.getSpmsStatus())) {
//                    // 存在未删除的仓库出库单
//                    outFlag = true;
//                }
//            }
//            if (outFlag) {
//                return ResponseResult.error("已存在未删除的仓库出库单，不能执行撤回操作");
//            }
//        }

        //EAM创建的退库单，直接删除退库数据
        this.baseMapper.delete(queryWrapper);
        QueryWrapper<EamFormerSkuDtl> dtlWrapper = new QueryWrapper<EamFormerSkuDtl>().eq("UUID_REQUISITION", uuidRequisition);
        iEamFormerSkuDtlService.remove(dtlWrapper);

        JSONObject dataToSap = formatDataToSap(eamFormerSku,"1",cancelReason);
        JSONObject message = JSONObject.parseObject(iFeignServiceCommon.sendRestToSapCommon(dataToSap));
        JSONObject RETURN_DATA = message.getJSONObject("RESPONSE").getJSONObject("RETURN_DATA");
        if (!"10000".equals(RETURN_DATA.getString("code"))) {
            throw new Exception("撤回退库EAM接口异常：");
        }

        iOverseaOperateLogService.addOverseaOperateLog(userId, uuidRequisition, "撤回退库单", "Withdraw the return slip", "", "Отзыв выписки.");
        return getRequisitionAndDtl(uuidRequisition);
    }

    private JSONObject formatDataToSap(EamFormerSku eamReturnSku,String state,String cancelReason) {
        JSONObject dataToSap = new JSONObject();
        JSONObject REQUEST = new JSONObject();
        JSONObject ESB_ATTRS = new JSONObject();
        JSONObject REQUEST_DATA = new JSONObject();
        Map<String, Object> head = new HashMap<String, Object>();
        Map<String, Object> data = new HashMap<String, Object>();
        data.put("WONUM", eamReturnSku.getRelateDocument());//EAM领用单号
        data.put("REASON", cancelReason);//撤回原因
        data.put("STATE", state);//状态（0=已完成，1=已撤回）
        head.put("OVDATA", data);
        REQUEST_DATA.put("SendData", head);
        REQUEST_DATA.put("Operation", "Z_SPMS_FORMER_SKU_BACK_EAM");
        REQUEST_DATA.put("Type", "FORMER_SKU_BACK_EAM");
        ESB_ATTRS.put("App_ID", "SPMS");
        ESB_ATTRS.put("Target_ID", "EAM");
        ESB_ATTRS.put("Application_ID", "00020000000002");
        ESB_ATTRS.put("Transaction_ID", UUID.randomUUID().toString());
        REQUEST.put("ESB_ATTRS", ESB_ATTRS);
        REQUEST.put("REQUEST_DATA", REQUEST_DATA);
        dataToSap.put("REQUEST", REQUEST);
        return dataToSap;
    }

    @Override
    public EamFormerSku getEamFormerSku(String uuidRequisition) {
        if (StringUtils.isEmpty(uuidRequisition)){
            return null;
        }
        return this.baseMapper.selectOne(new QueryWrapper<EamFormerSku>().eq("UUID_REQUISITION", uuidRequisition));
    }

}
