package nc.bs.mmpsc.pscrecive.rule;

import nc.bs.framework.common.NCLocator;
import nc.impl.pubapp.pattern.rule.IRule;
import nc.itf.mmpsc.pscsettle.ISettleMaintain;
import nc.itf.uap.pf.IPfExchangeService;
import nc.util.mmf.framework.base.MMArrayUtil;
import nc.util.mmf.framework.base.MMNumberUtil;
import nc.vo.mmpsc.pscrecive.entity.AggPscreciveVO;
import nc.vo.mmpsc.pscrecive.entity.PscreciveItemVO;
import nc.vo.mmpsc.pscrecive.entity.PscreciveQcVO;
import nc.vo.mmpsc.pscrecive.enumeration.PscReciveProcessMethodEnum;
import nc.vo.mmpsc.pscrecive.enumeration.PscReciveStatusEnum;
import nc.vo.mmpsc.pscsettle.entity.AggSettleVO;
import nc.vo.mmpsc.pscsettle.entity.SettleHeadVO;
import nc.vo.mmpsc.pscsettle.entity.SettleItemVO;
import nc.vo.pub.compiler.PfParameterVO;
import nc.vo.pub.lang.UFDouble;
import nc.vo.pubapp.pattern.exception.ExceptionUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * @Classname Push55E6Rule
 * @Description TODO
 * @Version 1.0.0
 * @Date 2025/6/16 14:40
 * @Created by ame
 */
public class Push55E6Rule implements IRule<AggPscreciveVO> {

    @Override
    public void process(AggPscreciveVO[] aggvos) {
        if(aggvos==null || aggvos.length<1){
            return;
        }
        ISettleMaintain service = NCLocator.getInstance().lookup(ISettleMaintain.class);
        try {
            AggPscreciveVO[] newAggvos = this.fiterData(aggvos);
            if(newAggvos!=null && newAggvos.length>0){
                IPfExchangeService ef = NCLocator.getInstance().lookup(IPfExchangeService.class);
                AggSettleVO[] aggSettleVOs = (AggSettleVO[])ef.runChangeDataAryNeedClassify("55E5", "55E6", newAggvos, (PfParameterVO)null, 1);
                if (aggSettleVOs != null && aggSettleVOs.length > 0) {
                    this.fillData(aggSettleVOs);
                    AggSettleVO[] aggSettleVOS = service.insertSettle(aggSettleVOs);
                    AggSettleVO[] approve = service.approve(aggSettleVOS);
                }
            }
        } catch (Exception e) {
            ExceptionUtils.wrappBusinessException(e.getMessage());
        }
    }

    private void fillData(AggSettleVO[] aggSettleVOs) {
        for (AggSettleVO aggSettleVO : aggSettleVOs) {
            SettleHeadVO headVO = aggSettleVO.getHeadVO();
            SettleItemVO[] itemVO = aggSettleVO.getItemVO();
            headVO.setStatus(2);
            headVO.setFstatusflag(1);
            //itemVO的vrowno根据序号设置值：i*10
            for (int i = 0; i < itemVO.length; i++) {
                itemVO[i].setStatus(2);
                itemVO[i].setVrowno(String.valueOf((i+1) * 10));
            }
        }
    }

    private AggPscreciveVO[] fiterData(AggPscreciveVO[] aggPscreciveVOs) {
        AggPscreciveVO[] statusvos = this.fiterDataStatus(aggPscreciveVOs);
        AggPscreciveVO[] qcvos = this.fiterDataQc(statusvos);
        return qcvos;
    }

    private AggPscreciveVO[] fiterDataStatus(AggPscreciveVO[] vos) {
        List<AggPscreciveVO> aggPscreciveVOs = new ArrayList<AggPscreciveVO>();
        for (AggPscreciveVO aggPscreciveVO : vos) {
            if (PscReciveStatusEnum.APPROVED.equalsValue(aggPscreciveVO.getHeadVO().getFstatusflag())) {
                aggPscreciveVOs.add(aggPscreciveVO);
            }
        }
        return aggPscreciveVOs.toArray(new AggPscreciveVO[aggPscreciveVOs.size()]);
    }

    private AggPscreciveVO[] fiterDataQc(AggPscreciveVO[] vos) {
        if (MMArrayUtil.isEmpty(vos)) {
            return null;
        }
        List<AggPscreciveVO> aggPscreciveVOs = new ArrayList<AggPscreciveVO>();
        for (AggPscreciveVO aggPscreciveVO : vos) {
            List<PscreciveItemVO> pscreciveItemVOs = new ArrayList<PscreciveItemVO>();
            for (PscreciveItemVO pscreciveItemVO : aggPscreciveVO.getItemVO()) {
                PscreciveQcVO[] pscreciveQcVOs = pscreciveItemVO.getCpscrecive_qcid();
                if (MMArrayUtil.isNotEmpty(pscreciveQcVOs)) {
                    UFDouble sumNum = UFDouble.ZERO_DBL;
                    UFDouble sumAstNum = UFDouble.ZERO_DBL;
                    for (PscreciveQcVO pscreciveQcVO : pscreciveQcVOs) {
                        if (PscReciveProcessMethodEnum.PRODIN.equalsValue(pscreciveQcVO.getFqprocessmethod())
                                || PscReciveProcessMethodEnum.MATERREJECT
                                .equalsValue(pscreciveQcVO.getFqprocessmethod())
                                || PscReciveProcessMethodEnum.REWORK.equalsValue(pscreciveQcVO.getFqprocessmethod())) {
                            sumNum = MMNumberUtil.add(sumNum, pscreciveQcVO.getNqnum());
                            sumAstNum = MMNumberUtil.add(sumAstNum, pscreciveQcVO.getNqastnum());
                        }
                    }
                    if (MMNumberUtil.isGtZero(sumNum) && MMNumberUtil.isGtZero(sumAstNum)) {
                        pscreciveItemVO.setProcessastnum(sumAstNum);
                        pscreciveItemVO.setProcessnum(sumNum);
                        pscreciveItemVOs.add(pscreciveItemVO);
                    }
                } else if (aggPscreciveVO.getHeadVO().getBreturn() != null
                        && aggPscreciveVO.getHeadVO().getBreturn().booleanValue()) {
                    pscreciveItemVO.setProcessastnum(MMNumberUtil.toNegValue(pscreciveItemVO.getNbastrecivenum()));
                    pscreciveItemVO.setProcessnum(MMNumberUtil.toNegValue(pscreciveItemVO.getNbrecivenum()));
                    pscreciveItemVOs.add(pscreciveItemVO);
                }
            }
            if (pscreciveItemVOs.size() > 0) {
                aggPscreciveVO.setChildrenVO(pscreciveItemVOs.toArray(new PscreciveItemVO[0]));
                aggPscreciveVOs.add(aggPscreciveVO);
            }
        }
        return aggPscreciveVOs.toArray(new AggPscreciveVO[aggPscreciveVOs.size()]);
    }


}
