package yem.base.common.module.version.dynamic;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.entity.DynamicObjectCollection;
import kd.bos.dataentity.metadata.IDataEntityProperty;
import kd.bos.dataentity.metadata.dynamicobject.DynamicObjectType;
import kd.bos.entity.EntityMetadataCache;
import kd.bos.entity.MainEntityType;
import kd.bos.entity.datamodel.IDataModel;
import kd.bos.entity.property.DecimalProp;
import kd.bos.entity.property.EntryProp;
import kd.bos.form.FormShowParameter;
import kd.bos.form.IFormView;
import kd.bos.form.control.Control;
import kd.bos.form.control.FilterGrid;
import kd.bos.form.plugin.AbstractFormPlugin;

import java.util.EventObject;

/**
 * 校验字段-表单插件
 * @description:回填变更方案删行校验字段
 * @author longh
 * @date 2021年11月25日 上午11:18:01
 */
public class VersionCheckColsEdit extends AbstractFormPlugin {

    @Override
    public void afterCreateNewData(EventObject evt) {
        super.afterCreateNewData(evt);
        // 获取当前模型和视图
        IDataModel model = this.getModel();
        IFormView view = this.getView();
        // 获取表单显示参数
        FormShowParameter showParameter = view.getFormShowParameter();
        // 从显示参数中获取实体编号和数据
        String entityNumber = showParameter.getCustomParam("entityNumber");
        JSONObject data = showParameter.getCustomParam("data");

        // 删除特定表的条目数据
        model.deleteEntryData("yem_entryentity");
        // 如果实体编号和数据不为空
        if(entityNumber != null && data != null) {
            // 从数据中获取校验实体和校验字段序列化信息
            String yem_checkdelentity = data.getString("yem_checkdelentity");
            String yem_checkcolsjson = data.getString("yem_checkcolsjson");
            String yem_parentdelentity = data.getString("yem_parentdelentity");//校验父实体标识
            // 创建字段列表
            JSONArray cols = new JSONArray();
            // 如果校验字段序列化信息不为空
            if(!yem_checkcolsjson.isEmpty()) {
                cols = JSON.parseArray(yem_checkcolsjson);
            }

            // 根据实体编号获取主实体类型
            MainEntityType mainType = EntityMetadataCache.getDataEntityType(entityNumber);
            IDataEntityProperty iDataEntityProperty = null;
            DynamicObjectType subType=null;
            //如果这个校验父实体标识不是空的，则进入通过父实体来获取子实体类型，否则就走正常的逻辑
            if(yem_parentdelentity!=null && !yem_parentdelentity.isEmpty()){
                //通过父实体标识来获取子单据体实体
                IDataEntityProperty iDataEntityProperty1 = mainType.getProperties().get(yem_parentdelentity);
                DynamicObjectType subType1 = ((EntryProp) iDataEntityProperty1).getDynamicCollectionItemPropertyType();
                iDataEntityProperty = subType1.getProperties().get(yem_checkdelentity);
                subType = ((EntryProp) iDataEntityProperty1).getDynamicCollectionItemPropertyType();

            }else{
                // 获取校验实体对应的属性
                iDataEntityProperty = mainType.getProperties().get(yem_checkdelentity);
                subType = ((EntryProp) iDataEntityProperty).getDynamicCollectionItemPropertyType();
            }
            // 遍历子实体类型的属性
            for (IDataEntityProperty property : subType.getProperties()) {
                String name = property.getName();
                // 排除空名称和序列号字段
                if(name.isEmpty() || name.equals("seq")) {
                    continue;
                }
                // 如果属性是数值类型
                if(property instanceof DecimalProp) {
                    // 获取显示名称
                    String displayName = property.getDisplayName() == null ? "" : property.getDisplayName().getLocaleValue();
                    // 在模型中创建新行
                    int index = model.createNewEntryRow("yem_entryentity");
                    // 设置列名和列号
                    model.setValue("yem_col", displayName, index);
                    model.setValue("yem_colno", name, index);
                    // 如果该列在选中字段列表中，设置复选框为选中状态
                    if(cols.contains(name)) {
                        model.setValue("yem_checkbox", true, index);
                    }
                }
            }
        }
    }

    /**
     * 注册监听器，定义了在注册监听器时的操作。
     * @param e 事件对象，表示要注册监听的事件。
     */
    @Override
    public void registerListener(EventObject e) {
        super.registerListener(e);
        // 注册点击事件监听器
        this.addClickListeners(new String[] { "btnok" });
    }

    /**
     * 处理点击事件，根据点击的控件执行相应的操作。
     * @param evt 事件对象，表示触发的点击事件。
     */
    @Override
    public void click(EventObject evt) {
        super.click(evt);
        // 获取点击的控件键值
        String key = ((Control) evt.getSource()).getKey().toLowerCase();
        // 根据键值执行相应的操作
        switch (key) {
            case "btnok":
                // 处理确定按钮的点击事件
                this.clickBtnOK();
                break;
            default:
                break;
        }
    }

    /**
     * 点击确定按钮时的操作，用于处理用户确认后的逻辑。
     */
    private void clickBtnOK() {
        // 获取当前模型和视图
        IDataModel model = this.getModel();
        IFormView view = this.getView();
        // 创建列名和列号的列表
        JSONArray cols = new JSONArray();
        JSONArray colnos = new JSONArray();

        // 获取“yem_entryentity”表的所有行
        DynamicObjectCollection entry = model.getEntryEntity("yem_entryentity");
        // 遍历所有行，筛选出选中的字段
        for (DynamicObject row : entry) {
            if(row.getBoolean("yem_checkbox")) {
                cols.add(row.getString("yem_col"));
                colnos.add(row.getString("yem_colno"));
            }
        }

        // 将选中的字段名和字段号封装到JSON对象中
        JSONObject jsonObj = new JSONObject();
        jsonObj.put("yem_col", cols);
        jsonObj.put("yem_colno", colnos);
        // 将数据返回给父窗口，并关闭当前窗口
        view.returnDataToParent(jsonObj);
        view.close();
    }

}
