package nckd.jxccl.hr.psms.plugin.operate.contribution.validate;

import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.entity.ExtendedDataEntity;
import kd.bos.entity.datamodel.events.PropertyChangedArgs;
import kd.bos.entity.validate.AbstractValidator;
import kd.bos.form.plugin.AbstractFormPlugin;
import kd.bos.orm.query.QCP;
import kd.bos.orm.query.QFilter;
import kd.sdk.plugin.Plugin;
import nckd.jxccl.base.common.constant.FormConstant;
import nckd.jxccl.base.common.utils.StrFormatter;
import nckd.jxccl.hr.psms.common.PerfRankMgmtConstant;
import nckd.jxccl.hr.psms.helper.PositionFileHelper;
import nckd.jxccl.hr.psms.helper.data.JobLevelRuleConfig;

import java.util.List;

/**
* 升保降级条件配置-校验
* 实体标识：nckd_levelconditionconf
* @author W.Y.C
* @date 2025/11/3 13:05
* @version 1.0
*/
public class LevelConditionConfValidate extends AbstractValidator {

    @Override
    public void validate() {
        for (ExtendedDataEntity dataEntity : this.getDataEntities()) {
            DynamicObject data = dataEntity.getDataEntity();
            long id = data.getLong(FormConstant.ID_KEY);
            List<JobLevelRuleConfig> levelConditionConf = PositionFileHelper.getLevelConditionConf(new QFilter(FormConstant.ID_KEY, QCP.not_equals, id));
            DynamicObject jobSeq = data.getDynamicObject(FormConstant.NCKD_JOBSEQ);
            DynamicObject minJobLevel = data.getDynamicObject(PerfRankMgmtConstant.NCKD_MINJOBLEVEL);
            int minJobLevelSeq = minJobLevel.getInt(FormConstant.JOBLEVELSEQ);
            DynamicObject maxJobLevel = data.getDynamicObject(PerfRankMgmtConstant.NCKD_MAXJOBLEVEL);
            int maxJobLevelSeq = maxJobLevel != null ? maxJobLevel.getInt(FormConstant.JOBLEVELSEQ) : Integer.MAX_VALUE;
            for (JobLevelRuleConfig jobLevelRuleConfig : levelConditionConf) {
                String jobSeqNumber = jobLevelRuleConfig.getJobSeqNumber();
                Integer maxJobLevelSeq1 = jobLevelRuleConfig.getMaxJobLevelSeq();
                Integer minJobLevelSeq1 = jobLevelRuleConfig.getMinJobLevelSeq();
                //相同序列，最大职级和最小职级不能重叠
                if (jobSeq != null && jobSeq.getString(FormConstant.NUMBER_KEY).equals(jobSeqNumber)) {
                    // 处理空值情况，null表示无限制
                    int existingMaxLevel = maxJobLevelSeq1 != null ? maxJobLevelSeq1 : Integer.MAX_VALUE;
                    int existingMinLevel = minJobLevelSeq1 != null ? minJobLevelSeq1 : Integer.MIN_VALUE;
                    // 判断职级范围是否重叠
                    boolean overlap = !(minJobLevelSeq > existingMaxLevel || maxJobLevelSeq < existingMinLevel);
                    if (overlap) {
                        this.addMessage(dataEntity, StrFormatter.format("职级范围与已有配置重叠【{}】，请调整最小职级或最大职级。", jobLevelRuleConfig.getName()));
                    }
                }
            }

        }
    }

}