package com.sunda.spmsorder.service.impl;

import com.sunda.spmscommon.ResponseResult;
import com.sunda.spmscommon.feign.IFeignServiceCommon;
import com.sunda.spmscommon.service.ISysLogService;
import com.sunda.spmsorder.entity.SapProjectOaNumber;
import com.sunda.spmsorder.entity.vo.SapProjectOaNumberQueryVO;
import com.sunda.spmsorder.mapper.SapProjectOaNumberMapper;
import com.sunda.spmsorder.service.ISapProjectOaNumberService;

import lombok.extern.slf4j.Slf4j;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.common.collect.Lists;

import static com.sunda.spmscommon.Constans.GET_SAP_PROJECT_NUMBER;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.TreeSet;
import java.util.UUID;
import java.util.stream.Collectors;

import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

/**
 * <p>
 * 项目立项OA表 服务实现类
 * </p>
 *
 * @author Wayne
 * @since 2022-10-21
 */
@Slf4j
@Service
public class SapProjectOaNumberServiceImpl extends ServiceImpl<SapProjectOaNumberMapper, SapProjectOaNumber> implements ISapProjectOaNumberService {
	
	@Autowired
    IFeignServiceCommon iFeignServiceCommon;

    @Autowired
    ISysLogService iSysLogService;
    
    @Value("${all.sap.client}")
    private String allSapClient;
	
	@SuppressWarnings("unchecked")
	@Override
	public IPage<SapProjectOaNumber> getSapProjectOaNumberList(SapProjectOaNumberQueryVO record) {
		IPage iPage = record.getPage();
		// 如果工厂下没有项目号就查询国家下的项目号
		List<Map<String, Object>> list = this.baseMapper.selectOaNumberList(iPage, record);
//		if (CollectionUtils.isEmpty(list)) {
//			record.setWerks(null);
//			list = this.baseMapper.selectOaNumberList(iPage, record);
//		}
        return iPage.setRecords(list);
	}

	@Override
	public ResponseResult getSapProjectOaNumberFromSap(SapProjectOaNumberQueryVO record, String userId) {
		String[] sapClients = allSapClient.split(",");
		JSONArray allArray = new JSONArray();
		for (int s = 0; s < sapClients.length; s++) {
			try {
				JSONObject dataToSap = formatDataToSap(sapClients[s]);
				String message = iFeignServiceCommon.sendRestToSapCommon(dataToSap);
				JSONObject doc = JSONObject.parseObject(message);
				addRestSapLog(message, dataToSap, userId);
				if (doc.containsKey("RESPONSE") && doc.getJSONObject("RESPONSE").containsKey("RETURN_DATA")){
					JSONObject RETURN_DATA = doc.getJSONObject("RESPONSE").getJSONObject("RETURN_DATA");
					if (RETURN_DATA.containsKey("EX_TYPE") && "S".equals(RETURN_DATA.getString("EX_TYPE"))){
						JSONArray ET_LIST = RETURN_DATA.getJSONArray("ET_LIST");
						allArray.addAll(ET_LIST);
					}
				}
			}catch (Exception e){
				e.printStackTrace();
				log.error("同步项目立项OA号接口失败："+e.getMessage());
			}
		}
		if (allArray.size() > 0) {
			insertProjectNUmber(allArray, userId);
		}
		return ResponseResult.success().add("msg", "同步成功" );
	}

	private void addRestSapLog(String respArray, JSONObject doc, String userId) {
		iSysLogService.spmsRestToSap("4", GET_SAP_PROJECT_NUMBER, "同步", userId,
                "com.sunda.spmsweb.ordercontroller.getSapProjectOaNumberFromSap()", doc.toJSONString(),
                "REST", respArray);
		
	}

	private List<SapProjectOaNumber> insertProjectNUmber(JSONArray array, String userId) {
		List<SapProjectOaNumber> insertHeadList = new ArrayList<SapProjectOaNumber>();
        try {
            for(int i = 0; i < array.size(); i++) {
            	Object obj = array.get(i);
            	Map<String, Object> m = JSONObject.parseObject(JSON.toJSONString(obj));
            	SapProjectOaNumber vo = new SapProjectOaNumber();
            	// 国家
    			vo.setCountry(m.get("GJ").toString());
    			// 项目名称
    			vo.setProjectname(m.get("XMMC").toString());
    			// 项目立项OA
    			vo.setProjectcode(m.get("XMOA").toString());
    			// 工厂
    			vo.setFbk1(m.get("WERKS") != null ? m.get("WERKS").toString() : "");
    			// 公司代码
    			vo.setFbk2(m.get("BUKRS") != null ? m.get("BUKRS").toString() : "");
    			// 状态
    			vo.setFbk3(m.get("STATUS") != null ? m.get("STATUS").toString() : "");
    			vo.setCreatetime(new Date());
    			vo.setCreateuser(userId);
    			insertHeadList.add(vo);
            }
            if (CollectionUtils.isNotEmpty(insertHeadList)) {
            	// 根据国家、项目立项OA号去重后再新增
            	ArrayList<SapProjectOaNumber> collect = insertHeadList.stream().filter(o -> StringUtils.isNotBlank(o.getCountry()) && StringUtils.isNotBlank(o.getProjectcode())).collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(o -> o.getCountry()+"_"+o.getProjectcode()))), ArrayList::new));
            	// 先删除
            	this.baseMapper.deleteBatch();
            	// 再新增
            	if (collect.size() > 1000) {
            		List<List<SapProjectOaNumber>> partition = Lists.partition(collect, 1000);
            		for (List<SapProjectOaNumber> list : partition) {
            			this.baseMapper.insertBatch(list);
            		}
            	} else {
            		this.baseMapper.insertBatch(collect);
            	}
            }
            return insertHeadList;
        }catch (Exception e){
            e.printStackTrace();
            return null;
        }
	}

	private JSONObject formatDataToSap(String sapClients) {
		JSONObject dataToSap = new JSONObject();
        JSONObject REQUEST = new JSONObject();
        JSONObject ESB_ATTRS = new JSONObject();
        JSONObject REQUEST_DATA = new JSONObject();
        JSONObject Head = new JSONObject();

        REQUEST_DATA.put("Head", Head);
        REQUEST_DATA.put("Operation", "Z_SRM_PROJECT_OANO");
        REQUEST_DATA.put("Type", "PROJECT_OANO");
        ESB_ATTRS.put("App_ID", "SPMS");
        ESB_ATTRS.put("Target_ID", sapClients);
        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;
	}

}
