package com.chinaitop.depot.intelligent.basicdata.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.chinaitop.depot.intelligent.basicdata.mapper.TLqinfoMapper;
import com.chinaitop.depot.intelligent.basicdata.model.TLqinfo;
import com.chinaitop.depot.intelligent.basicdata.model.TLqinfoExample;
import com.chinaitop.depot.intelligent.basicdata.service.GrainService;
import com.chinaitop.depot.intelligent.basicdata.service.WareHouseBasicInfoService;
import com.chinaitop.depot.intelligent.utils.JsonToObjectUtils;
import com.chinaitop.depot.intelligent.utils.ParameterUtil;
import com.chinaitop.depot.intelligent.utils.UuidUtils;
import com.unissoft.model.BasicEntity;
import com.unissoft.model.SendEntity;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@Service
public class GrainServiceImpl implements GrainService {
    @Resource
    private TLqinfoMapper tLqinfoMapper;
    @Resource
    private WareHouseBasicInfoService wareHouseBasicInfoService;
    @Resource
    private UuidUtils uUidUtils;

    @Override
    public List<TLqinfo> getList(String cfCode,String orgId) {
        TLqinfoExample example = new TLqinfoExample();
        TLqinfoExample.Criteria criteria = example.createCriteria();
        if (StringUtils.isNotEmpty(cfCode)) {
            criteria.andVcfcodeEqualTo(cfCode);
        }
        if (ParameterUtil.isnotnull(orgId)) {
            criteria.andOrgIdEqualTo(orgId);
        }
        criteria.andDelFlagEqualTo(1);//未删除
        example.setOrderByClause("vcfcode");
        return tLqinfoMapper.selectByExample(example);
    }

    @Override
    public TLqinfo getById(String id) {
        return tLqinfoMapper.selectByPrimaryKey(id);
    }

    @Transactional(rollbackFor = Exception.class)
    @Override
    public void save(String grainJson) {
        if (StringUtils.isNotBlank(grainJson)) {
            TLqinfo tLqinfo = (TLqinfo) JsonToObjectUtils.jsonToObject(grainJson, TLqinfo.class);
            // 推送基础数据
            JSONObject jsonObject = SendEntity.synchronizationConvert(grainJson);
            if (StringUtils.isNotBlank(tLqinfo.getId())) {
                tLqinfoMapper.updateByPrimaryKey(tLqinfo);
              // 推送数据并返回结果
                SendEntity.cxfFactor().saveGrainTemp (SendEntity.sendAndConvert(jsonObject, "U"));
                
            } else {
            	// 获取Max+1值
                Map<String, Object> valueMax = wareHouseBasicInfoService.getCode("t_lqinfo", "sitecode", "vdevcode", null);
                // 替换值
                jsonObject.put("vdevcode",valueMax.get("column2"));
                tLqinfo.setVdevcode(valueMax.get("column2").toString());
                tLqinfo.setId(uUidUtils.getCodeId(tLqinfo.getOrgId(), "t_lqinfo"));
                tLqinfo.setDelFlag(1); //未删除
                tLqinfoMapper.insert(tLqinfo);
             // 推送数据并返回结果
                SendEntity.cxfFactor().saveGrainTemp (SendEntity.sendAndConvert(jsonObject, "I"));
            }
        }
        
    }

    @Transactional(rollbackFor = Exception.class)
    @Override
    public int deleteById(String id,String basicGrainSetJson) {
    	TLqinfo tLqinfo = (TLqinfo) JsonToObjectUtils.jsonToObject(basicGrainSetJson, TLqinfo.class);
    	tLqinfo.setDelFlag(0); //删除
    	int i = tLqinfoMapper.updateByPrimaryKeySelective(tLqinfo);
    	
        //int i = tLqinfoMapper.deleteByPrimaryKey(id);
        if (i > 0) {
            // 推送同步数据
            JSONObject jsonObject = SendEntity.synchronizationConvert(basicGrainSetJson);
            SendEntity.cxfFactor().saveGrainTemp (SendEntity.sendAndConvert(jsonObject, "D"));
        }
        return i;
    }

    @Override
    public boolean getBycfCode(String vdevcode, String vdevname,String orgId) {
        TLqinfoExample example = new TLqinfoExample();
        TLqinfoExample.Criteria criteria = example.createCriteria();
        if (StringUtils.isNotEmpty(vdevcode)) {
            criteria.andVdevcodeEqualTo(vdevcode);
        }
        if (StringUtils.isNotEmpty(vdevname)) {
            criteria.andVdevnameEqualTo(vdevname);
        }
        if (ParameterUtil.isnotnull(orgId)) {
            criteria.andOrgIdEqualTo(orgId);
        }
        List<TLqinfo> tLqinfos = tLqinfoMapper.selectByExample(example);
        if (tLqinfos.size()>0){
            return true;
        }
        return false;
    }

    @Transactional
    @Override
    public String synchronizationAll(String orgId) {
        //获取所有基础数据getSingleGrainTemp
        String device = SendEntity.cxfFactor().getGrainTemp();
        //转换对象
        BasicEntity basicEntity = (BasicEntity) JsonToObjectUtils.jsonToObject(device, BasicEntity.class);
        if (basicEntity.getState().equals("0")) {
            List<Object> data = basicEntity.getData();
            if (data.size() > 0) {
                String tt = JSONObject.toJSONString(data);
                ArrayList<Object> objects = JsonToObjectUtils.jsonToObjectsDiverse(tt, TLqinfo.class,"yyyy-MM-dd'T'HH:mm:ss");
                objects.forEach(t -> {
                    TLqinfo tc = (TLqinfo) t;
                    tc.setId(uUidUtils.getCodeId(orgId, "t_lqinfo"));
                    tc.setOrgId(orgId);
                    tc.setDelFlag(1); //未删除
                    String vdevcode = tc.getVdevcode();
                    TLqinfo info1 = getVinfo(vdevcode);
                    if (info1 != null) {
                        tc.setId(info1.getId());
                        tLqinfoMapper.updateByPrimaryKey(tc);
                    } else {
                        tLqinfoMapper.insert(tc);
                    }
                });
            }
        } else {
            return basicEntity.getMsg();
        }
        return basicEntity.getMsg();
    }

    public TLqinfo getVinfo(String vdevcode) {
        TLqinfoExample example = new TLqinfoExample();
        TLqinfoExample.Criteria criteria = example.createCriteria();
        if (StringUtils.isNotEmpty(vdevcode)) {
            criteria.andVdevcodeEqualTo(vdevcode);
        }
        List<TLqinfo> infos = tLqinfoMapper.selectByExample(example);
        if (infos.size() > 0) {
            return infos.get(0);
        }
        return null;
    }
}
