package com.unis.base.server.domain;

import com.unis.base.common.vo.*;
import com.unis.base.server.dao.*;
import com.unis.base.server.entity.DTankDO;
import com.unis.base.server.entity.DYgxxsjyDO;
import com.unis.base.server.entity.TzSlqyDO;
import com.unis.common.utils.LsBeanUtils;
import lombok.extern.log4j.Log4j2;
import lombok.var;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.math.BigDecimal;
import java.util.*;

/**
 * @author huangxing
 * @version 1.0
 * @Title DYgxxsjyDomain
 * @ProjectName 持久化
 * @Description
 * @date 2019/07/22 17点26分
 */
@Component
@Log4j2
public class OiltankDomain extends BaseDomain {

	@Autowired
	private DYgxxsjyDao dYgxxsjyDao;

	@Autowired
	private DKdxxsjyDao dKdxxsjyDao;

	@Autowired
	TzSlqyDao tzSlqyMapper;

	@Autowired
    DYgxxsjyUpdateLogDao dYgxxsjyUpdateLogDao;

    @Autowired
    DCfxxsjyUpdateLogDao dCfxxsjyUpdateLogDao;

	/**
	 * 根据油罐参数获取油罐列表
	 * @param oiltankQueryVO
	 * @return
	 */
	public List<OiltankVO> getOiltankList(OiltankQueryVO oiltankQueryVO) {
		return dYgxxsjyDao.getOiltankList(oiltankQueryVO);
	}

	/**
	 * 根据油罐编号获取油罐信息
	 * @param ygbh
	 * @return
	 */
	public OiltankVO getOiltankInfo(String ygbh) {
		//DYgxxsjyDO dYgxxsjyDO = dYgxxsjyDao.getOiltankInfo( ygbh);
		DYgxxsjyDO dYgxxsjyDO = dYgxxsjyDao.getOiltank( ygbh);
		if(dYgxxsjyDO == null) {
			return null;
		}
		OiltankVO oiltankVO = new OiltankVO();
		LsBeanUtils.copyAllProperties(dYgxxsjyDO,oiltankVO);
//        String ygdm = oiltankVO.getYgdm();
//        Integer dataVer = oiltankVO.getDataVer();
//        String changeReason = dCfxxsjyUpdateLogDao.getChangeReason(ygdm, dataVer);
//        oiltankVO.setChangeReason(changeReason);
        return oiltankVO;
	}

	/**
	 * 更新油罐信息
	 * @param newOilTankData
	 * @return
	 */
	public int update(OiltankVO newOilTankData) {
		//DYgxxsjyDO dYgxxsjyDO = dYgxxsjyDao.getOiltankInfo( newOilTankData.getYgbh());
		DYgxxsjyDO oriData = dYgxxsjyDao.getOiltank(newOilTankData.getId());
        if(oriData == null) {
			return 0;
		}
        List<DCfxxsjyUpdateLogVO> updateDataList = oriData.checkInfo(newOilTankData);
        Integer dataVer = oriData.getDataVer();
        String ygdm = oriData.getYgdm();
        Integer sfba = newOilTankData.getSfba();
        var changeReason = newOilTankData.getChangeReason();
        String refresher = newOilTankData.getRefresher();
		LsBeanUtils.copyAllProperties(newOilTankData, oriData);
        List<DCfxxsjyUpdateLogVO> currentVerList = dCfxxsjyUpdateLogDao.listCurrentVerData(ygdm, dataVer);
        List<Integer> updateOperate = Arrays.asList(OiltankVO.SFBA.DTJ.getValue(), OiltankVO.SFBA.DSH.getValue());
        if (updateOperate.contains(sfba)) {
            if (currentVerList.size() == 0) {
                if (DCfxxsjyVO.SFBA.DSH.equalsVal(sfba)) {
                    boolean isNoChange = updateDataList.stream().allMatch(i -> i.getBeforeData().equals(newOilTankData.getYgzt()));
                    if (!isNoChange && StringUtils.isBlank(changeReason)) {
                        log.error(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 变更原因未填写");
                        return DCfxxsjyVO.UPDATE_RES.INVALID.getValue();
                    }
                }
                for (DCfxxsjyUpdateLogVO updateLog : updateDataList) {
                    updateLog.setDataVer(dataVer);
                    updateLog.setCreator(refresher);
                    updateLog.setRefresher(refresher);
                    updateLog.setChangeReason(changeReason);
                    dCfxxsjyUpdateLogDao.insertSelective(updateLog);
                }
            }else {
                boolean isNoChange = currentVerList.stream().allMatch(i -> i.getBeforeData().equals(newOilTankData.getYgzt()));
                if (OiltankVO.SFBA.DSH.equalsVal(sfba)) {
                    if (!isNoChange && StringUtils.isBlank(changeReason)) {
                        return OiltankVO.UPDATE_RES.INVALID.getValue();
                    }
                    dCfxxsjyUpdateLogDao.updateRefresher(ygdm, dataVer, refresher, changeReason);
                }
            }
        }else if (OiltankVO.SFBA.TG.equalsVal(sfba)) {
            for (DCfxxsjyUpdateLogVO currentVerOldData : currentVerList) {
                if (!currentVerOldData.getBeforeData().equals(newOilTankData.getYgzt())) {
                    int r = dCfxxsjyUpdateLogDao.updateStatusByVer(ygdm, dataVer, OiltankUpdateLogVO.COL.YGZT.getName(), newOilTankData.getYgzt());
                }
            }
            oriData.setDataVer(dataVer + 1);
        }

		int i = dYgxxsjyDao.update(oriData);


		// 刷新单位更新时间，触发数据上传重新抽取单位信息更新油罐数
        if(null != sfba && 5 == sfba) {
			TzSlqyDO tzSlqyDO = new TzSlqyDO();
			tzSlqyDO.setTyshxydm(oriData.getTyshxydm());
			tzSlqyDO.setRefreshTime(new Date());
			tzSlqyDO.setGr(new BigDecimal(1));
			tzSlqyMapper.updateTimeAndQyCr(tzSlqyDO);
        }
		return i;
	}

	/**
	 * 新增油罐信息
	 * @param oiltankVO
	 * @return
	 */
	public OiltankVO insert(OiltankVO oiltankVO) {
		//查询库点信息是否存在
		List<DKdxxsjyVO> dKdxxsjyList = dKdxxsjyDao.getDKdxxsjyInfo(oiltankVO.getTyshxydm());
		if(dKdxxsjyList.isEmpty()) {
			return null;
		}
		//进行库点信息copy
		DYgxxsjyDO dYgxxsjyDO = new DYgxxsjyDO();
		//根据库点代码生成油罐id（油罐id规则：库点id+001）
		//String ygbh = getMaxCodeById(dYgxxsjyDao.getMaxCodeById(oiltankVO.getKddm()),oiltankVO.getKddm(),3);
		//oiltankVO.setYgbh(ygbh);
		oiltankVO.setKddm(dKdxxsjyList.get(0).getKddm());
		oiltankVO.setKdmc(dKdxxsjyList.get(0).getKdmc());
		LsBeanUtils.copyAllProperties(oiltankVO,dYgxxsjyDO);
		dYgxxsjyDO.setStatus(oiltankVO.getStatus());
		// 按规则生成接口规范编码
		String maxYgdm = dYgxxsjyDao.getMaxCode(oiltankVO.getKddm(),"ygdm");
		String ygdm = getMaxCodeById(StringUtils.isEmpty(maxYgdm)?"1000":maxYgdm,dKdxxsjyList.get(0).getKqdm(),4);
		dYgxxsjyDO.setYgdm(ygdm);
		dYgxxsjyDO.setAjdh(ygdm+"000");
		dYgxxsjyDO.setHwdm(ygdm+"00001");
		dYgxxsjyDO.setId(getMaxCodeById(dYgxxsjyDao.getMaxCode(null,"id"),"",4));
		int x = dYgxxsjyDao.insert(dYgxxsjyDO);
		if(x>0) {
			return oiltankVO;
		}
		return null;
	}

	/**
	 * 更新油罐申请状态（0 可编辑 1 不可编辑）
	 * @param ygbh
	 * @return
	 */
	public int updateSqzt(String ygbh,String sqzt){
		try {
			dYgxxsjyDao.updateSqzt(ygbh, sqzt);
			return 1;
		}catch (Exception e){
			return 0;
		}
	}

    public boolean initData() {
		boolean result = true;
		try {
			//获取油罐最开始数据
			List<DTankDO> list = dYgxxsjyDao.selectTankList();
			List<TzSlqyDO> tzSlqyDOS = tzSlqyMapper.getSlqyByQybmAll();
			Map<String,TzSlqyDO> map = new HashMap<>();
			for(TzSlqyDO tzSlqyDO:tzSlqyDOS){
				if(map.get(tzSlqyDO.getQybm())!=null){
				}else{
					map.put(tzSlqyDO.getQybm(),tzSlqyDO);
				}
			}
			for(DTankDO tankDO:list){
				TzSlqyDO tzSlqyDO = map.get(tankDO.getOrg());
				DYgxxsjyDO ygxxsjyDO = new DYgxxsjyDO();
				ygxxsjyDO.setYgbh(tankDO.getStoragetankCode());
						//tzSlqyMapper.getSlqyByQybm(tankDO.getOrg());
				ygxxsjyDO.setKddm(tzSlqyDO.getZzjgdm()+"001");
				ygxxsjyDO.setKdmc(tzSlqyDO.getQymc());
				ygxxsjyDO.setYgmc(tankDO.getStoragetankName());
				ygxxsjyDO.setId(tankDO.getId());
				if(tankDO.getTankCapacity()!=null) {
					ygxxsjyDO.setSjgr(tankDO.getTankCapacity().doubleValue());
				}
				if(tankDO.getDiameter()!=null) {
					ygxxsjyDO.setYgzj(tankDO.getDiameter().doubleValue());
				}
				if(tankDO.getHeight()!=null) {
					ygxxsjyDO.setYggd(tankDO.getHeight().doubleValue());
				}
				if(tankDO.getDesignHeight()!=null){
					ygxxsjyDO.setZygd(tankDO.getDesignHeight().doubleValue());
				}

				ygxxsjyDO.setSjnd(tankDO.getBuilddate());
				ygxxsjyDO.setYgsyzt("1");
				ygxxsjyDO.setYglx(tankDO.getYglx());
				if(tankDO.getBottomArea()!=null) {
					ygxxsjyDO.setYgdmj(tankDO.getBottomArea().doubleValue());
				}
				if(tankDO.getDiameter()!=null) {
					ygxxsjyDO.setYgnzj(tankDO.getDiameter().doubleValue());
				}
				if(tankDO.getOilHeight()!=null) {
					ygxxsjyDO.setYgcykgd(tankDO.getOilHeight().doubleValue());
				}
				if(tankDO.getInsportHeight()!=null) {
					ygxxsjyDO.setYgjckgd(tankDO.getInsportHeight().doubleValue());
				}
				ygxxsjyDO.setYgpmt(tankDO.getTankChart());
				ygxxsjyDO.setYgzt(tankDO.getCrkStatus());
				ygxxsjyDO.setYgkqt(tankDO.getTanklibChart());
				ygxxsjyDO.setSqzt("0");
				//ygxxsjyDO.setSfba();
                ygxxsjyDO.setCrkStatus(tankDO.getCrkStatus());
				try {
					dYgxxsjyDao.insertSelective(ygxxsjyDO);
				}catch (Exception e){
					e.printStackTrace();
				}

			}
			result = true;
		}catch (Exception e){
			result = false;
		}
		return result;
	}

	public List<OiltankVO> getOiltankPages(OiltankQueryVO oiltankVO) {
		List<OiltankVO> list = dYgxxsjyDao.getOiltankPages(oiltankVO);
		return list;
	}

	public OiltankVO getOilTankInfo(OiltankQueryVO oiltankQueryVO) {
		DYgxxsjyDO dYgxxsjyDO = dYgxxsjyDao.getOilTankInfo(oiltankQueryVO);
		if(dYgxxsjyDO == null) {
			return null;
		}
		OiltankVO oiltankVO = new OiltankVO();
		LsBeanUtils.copyAllProperties(dYgxxsjyDO,oiltankVO);
		return oiltankVO;
	}

	public List<OiltankVO> getOilTankInfoList(OiltankQueryVO oiltankQueryVO) {
		List<DYgxxsjyDO> oilTankInfoList = dYgxxsjyDao.getOilTankInfoList(oiltankQueryVO);
		if (oilTankInfoList == null) {
			return null;
		}
		List<OiltankVO> oiltankVOS = new ArrayList<>();
		LsBeanUtils.copyCollection(oilTankInfoList, oiltankVOS, OiltankVO.class);
		return oiltankVOS;
	}

	public Integer delete(String id) {
		return dYgxxsjyDao.deleteById(id);
	}
}
