package shkd.repc.rebm.formplugin;

import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.entity.DynamicObjectCollection;
import kd.bos.dataentity.metadata.IDataEntityProperty;
import kd.bos.dataentity.utils.StringUtils;
import kd.bos.entity.EntityMetadataCache;
import kd.bos.entity.ValueMapItem;
import kd.bos.entity.datamodel.events.PropertyChangedArgs;
import kd.bos.entity.property.BasedataProp;
import kd.bos.entity.property.ComboProp;
import kd.bos.form.control.RichTextEditor;
import kd.bos.form.plugin.AbstractFormPlugin;
import kd.bos.orm.query.QCP;
import kd.bos.orm.query.QFilter;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import kd.bos.servicehelper.MetadataServiceHelper;
import kd.scm.bid.common.constant.entity.BidAnnouncementConstant;
import kd.scm.bid.common.constant.entity.BidTemplateMangeEntity;
import kd.scm.bid.common.constant.entity.BidTemplateTypeEntity;
import kd.sdk.plugin.Plugin;
import shkd.repc.rebm.formplugin.fieldinsert.entity.ModelType;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 函件模板生成
 * @author 李贵强
 */
public class CustomFieldReplacePlugin extends AbstractFormPlugin implements Plugin {


    @Override
    public void propertyChanged(PropertyChangedArgs e) {
        super.propertyChanged(e);
        String fieldKey = e.getProperty().getName();
        if (StringUtils.equals(fieldKey, BidAnnouncementConstant.BIDANNTEMPLATE)) {
            //获取上游单据所需字段
            //父页面id
            Map<String, Object> customParams = this.getView().getFormShowParameter().getCustomParams();
            Long pkValue = (Long)customParams.get("pkid");
            //公告模板
            DynamicObject announcement = (DynamicObject) this.getModel().getValue(BidAnnouncementConstant.BIDANNTEMPLATE);
            //函件模板
            DynamicObject correspondence = announcement.getDynamicObject(BidTemplateMangeEntity.TYPE);
            //模板类型名称
            String name = correspondence.getString(BidTemplateTypeEntity.NAME);
            ModelType type = ModelType.fromString(name);
            //获取扩展字段上添加字段
            DynamicObject extendedDynamic = BusinessDataServiceHelper.loadSingle("qeug_insertfield", (new QFilter("number", QCP.equals, type.toString())).toArray());
            if (null != extendedDynamic) {
                DynamicObjectCollection insertEntry = extendedDynamic.getDynamicObjectCollection("qeug_entryentity");
                if (null != insertEntry && insertEntry.size() != 0) {
                    Map<String, String> replacements = new HashMap<>();
                    for (DynamicObject entry : insertEntry) {
                        //父页面单据标识
                        String sourceId = entry.getString("qeug_sourceid");
                        //父页面字段类型
                        String fieldType = entry.getString("qeug_fieldtype");
                        //父页面字段标识
                        String fieldId = entry.getString("qeug_fieldid");
                        //扩展字段名称
                        String fieldName = entry.getString("qeug_fieldname");
                        String fatherParam = this.getFatherParam(pkValue, sourceId, fieldId,fieldType);
                        replacements.put(fieldName,fatherParam);
                    }
                    RichTextEditor editor = (RichTextEditor) this.getView().getControl(BidAnnouncementConstant.RICHTEXTEDITORAP);
                    String text = editor.getText();
                    if (text!=null){
                        String newText = replacePlaceholders(text, replacements);
                        editor.setText(newText);
                    }
                }
            }
        }
    }

    /**
     * 获取父页面字段值
     * @param pkValue 单据id
     * @param sourceId 单据标识
     * @param fieldId 字段标识
     * @return 字段值
     */
    public String getFatherParam(Long pkValue, String sourceId, String fieldId, String fieldType) {
        if (pkValue == null || sourceId == null || fieldId == null || fieldType == null) {
            return "";
        }

        DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(sourceId,
                new QFilter("id", QCP.equals, pkValue).toArray());
        if (dynamicObject == null) {
            return "";
        }

        switch (fieldType) {
            case "ComboProp":
                String param = dynamicObject.getString(fieldId);
                return getComboPropName(param, sourceId, fieldId);

            case "BasedataProp":
                DynamicObject dynamicObj = dynamicObject.getDynamicObject(fieldId);
                if (dynamicObj != null) {
                    IDataEntityProperty property = MetadataServiceHelper.getDataEntityType(sourceId).getProperty(fieldId);
                    if (property instanceof BasedataProp) {
                        String displayProp = ((BasedataProp) property).getDisplayProp();
                        return dynamicObj.getString(displayProp);
                    }
                }
                break;

            case "DecimalProp":
                BigDecimal decimalValue = dynamicObject.getBigDecimal(fieldId);
                return decimalValue != null ? decimalValue.setScale(2, BigDecimal.ROUND_HALF_UP).toString() : "0.00";

            case "DateTimeProp":
                Date date = dynamicObject.getDate(fieldId);
                return date != null ? new SimpleDateFormat("yyyy-MM-dd").format(date) : "";

            default:
                return "";
        }

        return "";
    }

    /**
     * 获取下拉项的名称
     * @param param 下拉项value
     * @param sourceId 单据标识
     * @param fieldId 字段标识
     * @return name
     */
    public String getComboPropName(String param,String sourceId,String fieldId){
        String name="";
        List<ValueMapItem> comboItems = ((ComboProp) EntityMetadataCache.getDataEntityType(sourceId).getProperty(fieldId)).getComboItems();
        if (comboItems!=null&&comboItems.size()!=0){
            for (ValueMapItem comboItem : comboItems) {
                String value = comboItem.getValue();
                if (value.equals(param)){
                     name = String.valueOf(comboItem.getName());
                    break;
                }
            }
        }
        return name;
    }


    /**
     * 自定义的replace方法,通过传入一个Map来替换对应的占位符
     * @param input 文本
     * @param replacements 替换值
     * @return 替换后的文本
     */
    public static String replacePlaceholders(String input, Map<String, String> replacements) {
        // 正则表达式匹配{xxx}的模式
        Pattern pattern = Pattern.compile("\\{([^}]+)\\}");
        Matcher matcher = pattern.matcher(input);

        StringBuffer result = new StringBuffer();

        // 查找所有匹配的占位符并替换
        while (matcher.find()) {
            String placeholder = matcher.group(1); // 获取占位符名称
            String replacement = replacements.get(placeholder); // 获取替换值
            if (replacement == null) {
                replacement = ""; // 如果Map中没有替换值,默认替换为空
            }
            matcher.appendReplacement(result, replacement);
        }
        matcher.appendTail(result);
        return result.toString();
    }
}