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.plugin.PreparePropertysEventArgs;
import kd.bos.entity.plugin.args.AfterOperationArgs;
import kd.bos.entity.plugin.args.EndOperationTransactionArgs;
import kd.bos.orm.query.QFilter;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import kd.bos.servicehelper.QueryServiceHelper;
import kd.repc.rebas.common.bizutil.ReOperateOptionUtil;
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.ReAimCostUtil;
import kd.repc.recos.business.conplan.ReConPlanGenByAimCostHelper;
import kd.repc.recos.business.conplan.ReConPlanHelper;
import kd.repc.recos.business.costversion.ReCostVersionSyncUtil;
import kd.repc.recos.business.dyncost.ReDynCostSynUtil;
import kd.repc.recos.opplugin.billtpl.RecosBillUnAuditOpPlugin;

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

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

    public void onPreparePropertys(PreparePropertysEventArgs e) {
        super.onPreparePropertys(e);
        List<String> fieldKeys = e.getFieldKeys();
        fieldKeys.add("billno");
        fieldKeys.add("project");
        fieldKeys.add("importflag");
        fieldKeys.add("measurecostid");
        fieldKeys.add("coststage");
        fieldKeys.add("projectversion");
        fieldKeys.add("bizdate");
        fieldKeys.add("handler");
        fieldKeys.add("shapetype");
    }

    protected void checkBeforeOperation(RebasBillValidator validator, ExtendedDataEntity dataEntity) {
        super.checkBeforeOperation(validator, dataEntity);
        DynamicObject aimCost = dataEntity.getDataEntity();
        DynamicObject project = aimCost.getDynamicObject("project");
        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("已存在未审核的目标成本调整单,不允许反审核!", "ReAimCostUnAuditOpPlugin_0", "repc-recos-opplugin", new Object[0]));
        }

        Optional.ofNullable(ReAimCostUtil.getLastAimCostHead(project.getPkValue(), Boolean.FALSE)).ifPresent((lastAimCost) -> {
            String currentVersion = aimCost.getString("billno").replace("V", "");
            String lastBillNo = lastAimCost.getString("billno").replace("V", "");
            String lastBigVersion = lastBillNo.substring(0, lastBillNo.lastIndexOf("."));
            String currentBigVersion = currentVersion.substring(0, currentVersion.lastIndexOf("."));
            if (ReDigitalUtil.compareTo(lastBigVersion, currentBigVersion) > 0) {
                validator.addErrorMessage(dataEntity, ResManager.loadKDString("已存在较新版目标成本,不允许反审核。", "ReAimCostUnAuditOpPlugin_1", "repc-recos-opplugin", new Object[0]));
            } else {
                if (ReDigitalUtil.compareTo(lastBigVersion, currentBigVersion) == 0) {
                    String hisSmallVersion = lastBillNo.substring(lastBillNo.lastIndexOf(".") + 1);
                    String currentSmallVersion = currentVersion.substring(currentVersion.lastIndexOf(".") + 1);
                    if (ReDigitalUtil.compareTo(hisSmallVersion, currentSmallVersion) > 0) {
                        validator.addErrorMessage(dataEntity, ResManager.loadKDString("已存在较新版目标成本,不允许反审核。", "ReAimCostUnAuditOpPlugin_1", "repc-recos-opplugin", new Object[0]));
                        return;
                    }
                }

            }
        });
        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("存在已提交或已审核状态的合约规划,不允许反审核。", "ReAimCostUnAuditOpPlugin_2", "repc-recos-opplugin", new Object[0]));
        } else {
            boolean genByMeasureCost = !ReOperateOptionUtil.checkOperateSource(this.getOption(), "recos_measurecost") && ("0".equals(aimCost.getString("shapetype")) || aimCost.getLong("measurecostid") != 0L);
            if (genByMeasureCost) {
//                validator.addErrorMessage(dataEntity, ResManager.loadKDString("该目标成本为成本测算生成,如需反审核,请对成本测算进行反审核。", "ReAimCostUnAuditOpPlugin_3", "repc-recos-opplugin", new Object[0]));
            } else {
                boolean opFromMeasureCost = ReOperateOptionUtil.checkOperateSource(this.getOption(), "recos_measurecost");
                if (!opFromMeasureCost) {
                    boolean comeFromAimAdjust = QueryServiceHelper.exists("recos_aimadjust", new QFilter[]{new QFilter("project", "=", project.getPkValue()), new QFilter("coststage", "=", aimCost.getDynamicObject("coststage").getPkValue()), new QFilter("projectversion", "=", aimCost.getString("projectversion")), new QFilter("bizdate", "=", aimCost.get("bizdate")), new QFilter("handler", "=", aimCost.getDynamicObject("handler").getPkValue())});
                    if (comeFromAimAdjust) {
                        validator.addErrorMessage(dataEntity, ResManager.loadKDString("该目标成本为目标成本调整生成,不允许反审核。", "ReAimCostUnAuditOpPlugin_4", "repc-recos-opplugin", new Object[0]));
                    }

                }
            }
        }
    }

    protected void endUnAuditTransaction(EndOperationTransactionArgs args, DynamicObject model) {
        super.endUnAuditTransaction(args, model);
    }

    protected void afterUnAuditTransaction(AfterOperationArgs args, DynamicObject model) {
        super.afterUnAuditTransaction(args, model);
        this.syncConPlanByAimCostUnAudit(model.getPkValue());
        ReCostVersionSyncUtil.syncCostVersionData("recos_aimcost");
        Optional.ofNullable(model.getDynamicObject("project")).ifPresent((p) -> {
            ReDynCostSynUtil.setDynCostLatestDataFlag(p.getPkValue());
        });
    }

    public void syncConPlanByAimCostUnAudit(Object aimCostId) {
        DynamicObject aimCostObj = BusinessDataServiceHelper.loadSingle(aimCostId, "recos_aimcost");
        DynamicObject projectObj = aimCostObj.getDynamicObject("project");
        ReConPlanHelper.deleteConPlanData((Long)projectObj.getPkValue());
        DynamicObject preLastAimCost = ReAimCostUtil.getLastAimCostHead(projectObj.getPkValue(), true);
        if (null != preLastAimCost) {
            ReConPlanGenByAimCostHelper.syncConPlanByAimCost(preLastAimCost.getPkValue());
        }

    }
}