package shkd.repc.recos.opplugin;

import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.resource.ResManager;
import kd.bos.entity.ExtendedDataEntity;
import kd.bos.entity.operate.result.IOperateInfo;
import kd.bos.entity.operate.result.OperationResult;
import kd.bos.entity.plugin.PreparePropertysEventArgs;
import kd.bos.entity.plugin.args.AfterOperationArgs;
import kd.bos.entity.plugin.args.BeginOperationTransactionArgs;
import kd.bos.entity.plugin.args.EndOperationTransactionArgs;
import kd.bos.orm.query.QCP;
import kd.bos.orm.query.QFilter;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import kd.bos.servicehelper.QueryServiceHelper;
import kd.repc.rebas.common.bizutil.ReProjectUtil;
import kd.repc.rebas.common.enums.ReBillStatusEnum;
import kd.repc.rebas.common.util.ReDigitalUtil;
import kd.repc.rebas.opplugin.base.RebasBillValidator;
import kd.repc.recos.business.aimcost.AimCostGenByMeasureHelper;
import kd.repc.recos.business.conplan.ReConPlanHelper;
import kd.repc.recos.business.costversion.ReCostVersionSyncUtil;
import kd.repc.recos.business.measure.ReMeasureCostUtil;
import kd.repc.recos.business.measure.ReMeasureInterperiodUtil;
import kd.repc.recos.opplugin.billtpl.RecosBillUnAuditOpPlugin;

import java.util.List;
import java.util.Optional;

public class ReMeasureCostUnAuditOpPluginTwo extends RecosBillUnAuditOpPlugin {
    public ReMeasureCostUnAuditOpPluginTwo() {
    }

    public void onPreparePropertys(PreparePropertysEventArgs e) {
        super.onPreparePropertys(e);
        List<String> fieldKeys = e.getFieldKeys();
        fieldKeys.add("project");
        fieldKeys.add("billno");
        fieldKeys.add("aimversionflag");
        fieldKeys.add("version");
        fieldKeys.add("hasconplangrpflag");
        fieldKeys.add("coststage");
    }

    protected void checkBeforeOperation(RebasBillValidator validator, ExtendedDataEntity dataEntity) {
        super.checkBeforeOperation(validator, dataEntity);
        DynamicObject measureCost = dataEntity.getDataEntity();
        DynamicObject project = measureCost.getDynamicObject("project");
        DynamicObject costStage = measureCost.getDynamicObject("coststage");
        boolean hasAdjustData = QueryServiceHelper.exists("recos_aimadjust", new QFilter[]{new QFilter("billstatus", "<>", ReBillStatusEnum.AUDITTED.getValue()), new QFilter("project", "=", project.getPkValue())});
        if (hasAdjustData) {
            validator.addErrorMessage(dataEntity, ResManager.loadKDString("已存在未审核的目标成本调整单,不允许反审核!", "ReMeasureCostUnAuditOpPlugin_0", "repc-recos-opplugin", new Object[0]));
        }

        Optional.ofNullable(ReMeasureCostUtil.getHistoryMeasureCost(project.getPkValue(), measureCost.getPkValue(), costStage.getPkValue())).ifPresent((hisMeasure) -> {
            String currentVersion = measureCost.getString("billno").replace("V", "");
            String hisBillNo = hisMeasure.getString("billno").replace("V", "");
            String hisBigVersion = hisBillNo.substring(0, hisBillNo.lastIndexOf("."));
            String currentBigVersion = currentVersion.substring(0, currentVersion.lastIndexOf("."));
            if (ReDigitalUtil.compareTo(hisBigVersion, currentBigVersion) > 0) {
                validator.addErrorMessage(dataEntity, ResManager.loadKDString("已有下一版本,不能反审核。", "ReMeasureCostUnAuditOpPlugin_1", "repc-recos-opplugin", new Object[0]));
            } else {
                if (ReDigitalUtil.compareTo(hisBigVersion, currentBigVersion) == 0) {
                    String hisSmallVersion = hisBillNo.substring(hisBillNo.lastIndexOf(".") + 1);
                    String currentSmallVersion = currentVersion.substring(currentVersion.lastIndexOf(".") + 1);
                    if (ReDigitalUtil.compareTo(hisSmallVersion, currentSmallVersion) > 0) {
                        validator.addErrorMessage(dataEntity, ResManager.loadKDString("已有下一版本,不能反审核。", "ReMeasureCostUnAuditOpPlugin_1", "repc-recos-opplugin", new Object[0]));
                        return;
                    }
                }

            }
        });
        boolean targetFlag = measureCost.getBoolean("aimversionflag");
        if (targetFlag) {
            boolean projectConPlan = QueryServiceHelper.exists("recos_conplan", new QFilter[]{new QFilter("billstatus", "in", new String[]{ReBillStatusEnum.SUBMITTED.getValue(), ReBillStatusEnum.AUDITTED.getValue()}), new QFilter("project", "=", project.getPkValue())});
            if (projectConPlan) {
                validator.addErrorMessage(dataEntity, ResManager.loadKDString("对应项目分期合约规划为已审核状态或已提交, 不能反审核。", "ReMeasureCostUnAuditOpPlugin_2", "repc-recos-opplugin", new Object[0]));
            }
        }

        QFilter measurecostid = new QFilter("project", QCP.equals, measureCost.getDynamicObject("project").getPkValue());
        DynamicObject[] load = BusinessDataServiceHelper.load("recos_aimcost", "id", measurecostid.toArray());
        if (load!=null&&load.length!=0) {
            validator.addErrorMessage(dataEntity, ResManager.loadKDString("存在对应项目的目标成本,无法反审核。", "ReMeasureCostUnAuditOpPlugin_2", "repc-recos-opplugin", new Object[0]));
        }

        if (measureCost.getBoolean("aimversionflag")) {
            Boolean hasSaveConPlan = ReConPlanHelper.checkConPlanStatus(project.getLong("id"));
            if (hasSaveConPlan) {
                OperationResult unAuditOpResult = AimCostGenByMeasureHelper.unAuditAimCost(measureCost.getPkValue());
                if (null != unAuditOpResult && !unAuditOpResult.isSuccess()) {
                    validator.addErrorMessage(dataEntity, ((IOperateInfo)unAuditOpResult.getAllErrorOrValidateInfo().get(0)).getMessage());
                }
            }
        }

    }

    protected void beginUnAuditTransaction(BeginOperationTransactionArgs args, DynamicObject model) {
        super.beginUnAuditTransaction(args, model);
        DynamicObject project = model.getDynamicObject("project");
        DynamicObject hisMeasure = ReMeasureCostUtil.getHistoryMeasureCost(project.getPkValue(), model.getPkValue());
        if (null == hisMeasure) {
            model.set("hasconplangrpflag", (Object)null);
        } else {
            model.set("hasconplangrpflag", hisMeasure.get("hasconplangrpflag"));
        }

    }

    protected void endUnAuditTransaction(EndOperationTransactionArgs args, DynamicObject model) {
        super.endUnAuditTransaction(args, model);
        DynamicObject project = model.getDynamicObject("project");
        long currLeafProjectId = project.getLong("id");
        long mainProjectId = ReProjectUtil.getProjectF7(currLeafProjectId).getLong("mainprojectid");
        long costStageId = model.getDynamicObject("coststage").getLong("id");
        ReMeasureInterperiodUtil.unAuditUpdateAllInterperiodDataByProject(mainProjectId, model.getLong("id"), currLeafProjectId, costStageId);
    }

    protected void afterUnAuditTransaction(AfterOperationArgs args, DynamicObject model) {
        super.afterUnAuditTransaction(args, model);
        if (model.getBoolean("aimversionflag")) {
            DynamicObject project = model.getDynamicObject("project");
            Boolean hasSaveConPlan = ReConPlanHelper.checkConPlanStatus(project.getLong("id"));
            if (hasSaveConPlan) {
                AimCostGenByMeasureHelper.deleteAimCost(model.getPkValue());
            }
        }

        ReCostVersionSyncUtil.syncCostVersionData("recos_measurecost");
    }
}