package nckd.jxccl.hr.psms.plugin.operate.other;

import kd.bos.dataentity.OperateOption;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.entity.DynamicObjectCollection;
import kd.bos.dataentity.utils.ObjectUtils;
import kd.bos.entity.EntityMetadataCache;
import kd.bos.entity.ExtendedDataEntity;
import kd.bos.entity.MainEntityType;
import kd.bos.entity.operate.result.IOperateInfo;
import kd.bos.entity.operate.result.OperationResult;
import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
import kd.bos.entity.plugin.AddValidatorsEventArgs;
import kd.bos.entity.plugin.PreparePropertysEventArgs;
import kd.bos.entity.plugin.args.BeginOperationTransactionArgs;
import kd.bos.entity.validate.AbstractValidator;
import kd.bos.logging.Log;
import kd.bos.logging.LogFactory;
import kd.bos.orm.query.QCP;
import kd.bos.orm.query.QFilter;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import kd.bos.servicehelper.QueryServiceHelper;
import kd.bos.servicehelper.operation.OperationServiceHelper;
import kd.sdk.plugin.Plugin;
import nckd.jxccl.base.common.constant.FormConstant;
import nckd.jxccl.base.common.enums.psms.TypeStateEnum;
import nckd.jxccl.base.common.exception.ValidationException;
import nckd.jxccl.base.common.utils.QueryFieldBuilder;
import nckd.jxccl.hr.psms.common.PositionStructureConstant;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.StringJoiner;
import java.util.stream.Collectors;

/**
* 事务变动生效后离职/退休事件订阅操作插件-管理人员任命
* 实体标识：nckd_mgrappointmgmt
* @author W.Y.C
* @date 2025/12/5 10:44
* @version 1.0
*/
public class MgrAppointMgmtQuitAfterEffectOp extends AbstractOperationServicePlugIn implements Plugin {


    private static final Log log = LogFactory.getLog(MgrAppointMgmtQuitAfterEffectOp.class);

    @Override
    public void onPreparePropertys(PreparePropertysEventArgs e) {
        e.getFieldKeys().addAll(this.billEntityType.getAllFields().keySet());
    }

    @Override
    public void onAddValidators(AddValidatorsEventArgs e) {
        e.addValidator(new AbstractValidator() {
            @Override
            public void validate() {
                for (ExtendedDataEntity row : this.getDataEntities()) {
                    DynamicObject dataEntity = row.getDataEntity();
                    //人员
                    DynamicObject employee = dataEntity.getDynamicObject(FormConstant.BB_EM_TID);
                    if(employee == null){
                        this.addFatalErrorMessage(row, "人员不能为空");
                    }
                }
            }
        });
    }



    @Override
    public void beginOperationTransaction(BeginOperationTransactionArgs e) {
        List<Long> personIdList = new ArrayList<>();
        for (DynamicObject dataEntity : e.getDataEntities()) {
            DynamicObject employee = dataEntity.getDynamicObject(FormConstant.BB_EM_TID);
            if(employee != null){
                personIdList.add(employee.getLong(FormConstant.ID_KEY));
            }
        }
        //查询管理人员任命
        QueryFieldBuilder queryFieldBuilder = QueryFieldBuilder.create()
                .add(FormConstant.ID_KEY);
        QFilter qFilter = new QFilter(PositionStructureConstant.NCKD_PERSON, QCP.in, personIdList);
        qFilter.and(PositionStructureConstant.NCKD_TYPESTATE, QCP.equals, TypeStateEnum.MANAGEMENT_SEQUENCE_EMPLOYMENT.getCode());
        DynamicObjectCollection query = QueryServiceHelper.query(PositionStructureConstant.NCKD_PERSONPOSFILE, queryFieldBuilder.buildSelect(), new QFilter[]{qFilter});
        List<Long> ids = query.stream()
                .map(obj -> obj.getLong(FormConstant.ID_KEY))
                .collect(ArrayList::new, ArrayList::add, ArrayList::addAll);
        MainEntityType entityType = EntityMetadataCache.getDataEntityType(PositionStructureConstant.NCKD_PERSONPOSFILE);
        DynamicObject[] load = BusinessDataServiceHelper.load(ids.toArray(new Long[0]), entityType);
        // 按人员分组，Map<人员ID, List<职位档案>>
        Map<Long, List<DynamicObject>> personPosFileMap = Arrays.stream(load)
                .collect(Collectors.groupingBy(
                        obj -> obj.getLong(String.join(".", FormConstant.NCKD_PERSON, FormConstant.ID_KEY))
                ));

        List<DynamicObject> endMgrAppointMgmt = new ArrayList<>();
        for (DynamicObject dataEntity : e.getDataEntities()) {
            //人员
            DynamicObject employee = dataEntity.getDynamicObject(FormConstant.BB_EM_TID);
            long empId = dataEntity.getLong(String.join(".", FormConstant.BB_EM_TID, FormConstant.ID_KEY));
            //离职生效日期
            Date effectiveDate = dataEntity.getDate(FormConstant.B_EFFECTIVEDATE);
            List<DynamicObject> personPosFile = personPosFileMap.get(empId);

            //判断有没有在任命的记录，有则终止任命
            if(personPosFile != null && !personPosFile.isEmpty()){
                for(DynamicObject record : personPosFile){
                    String appointStatus = record.getString(PositionStructureConstant.NCKD_APPOINTSTATUS);
                    if(!"1".equals(appointStatus)){
                        // 终止任命
                        record.set(PositionStructureConstant.NCKD_APPOINTSTATUS, "0");
                        record.set(PositionStructureConstant.NCKD_ENDDATE, effectiveDate);
                        record.set(PositionStructureConstant.NCKD_DESCRIPTION, "离职单/退休单终止任命");
                        endMgrAppointMgmt.add(record);
                    }
                }
            }
        }
        if(!endMgrAppointMgmt.isEmpty()){
            OperateOption operateOption = OperateOption.create();
            operateOption.setVariableValue(PositionStructureConstant.NCKD_TYPESTATE, TypeStateEnum.MANAGEMENT_SEQUENCE_EMPLOYMENT.getCode());
            OperationResult operationResult = OperationServiceHelper.executeOperate(
                    "endappointment",
                    PositionStructureConstant.PERSONPOSFILE_ENTITYID,
                    endMgrAppointMgmt.toArray(new DynamicObject[0]),
                    OperateOption.create()
            );

            if (operationResult != null && !operationResult.isSuccess()) {
                StringJoiner errorMsg = new StringJoiner("；");
                for (IOperateInfo error : operationResult.getAllErrorOrValidateInfo()) {
                    errorMsg.add(error.getMessage());
                }
                if (!ObjectUtils.isEmpty(operationResult.getMessage())) {
                    errorMsg.add(operationResult.getMessage());
                }
                throw new ValidationException("同步管理人员任命异常，原因：" + errorMsg.toString());
            }
        }
    }
}