package com.kingdee.shr.base.syssetting.web.templatetranslator.freemarker;

import com.kingdee.shr.base.syssetting.web.dynamic.model.UIViewInfo;
import com.kingdee.shr.base.syssetting.web.templatetranslator.IElementTranslatorStore;
import com.kingdee.shr.base.syssetting.web.templatetranslator.TemplateTranslateException;
import com.kingdee.util.StringUtils;
import org.jdom.Element;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Description 编辑表格模板转换器
 * @Date 2025/11/25 10:56
 * @Created by 禾源
 */
public class EditGridTranslator extends GridTranslator {
    /**
     * 翻译表格（Grid）类型的元素，根据其属性和上下文信息生成对应的模板字符串。
     *
     * @param element  表示当前要翻译的DOM元素，通常是一个grid组件
     * @param viewInfo 包含视图相关信息的对象，用于获取类型等配置信息
     * @param store    用于存储或查找翻译器的仓库对象
     * @return 返回经过处理后的模板字符串，表示该grid在界面中的呈现方式
     * @throws TemplateTranslateException 当模板翻译过程中出现错误时抛出异常
     */
    public String translateGrid(
            Element element,
            UIViewInfo viewInfo,
            IElementTranslatorStore store
    ) throws TemplateTranslateException {
        Map<String, Object> options = new HashMap();
        String fieldName = null;
        String type = viewInfo.getType();

        // 根据视图类型判断是否需要设置字段名，默认为"entrys"
        if ("form".equalsIgnoreCase(type)) {
            fieldName = element.getAttributeValue("name");
            if (StringUtils.isEmpty(fieldName)) {
                fieldName = "entrys";
            }
        }

        // 若存在字段名，则将其作为gridId和entryName放入选项中
        if (!StringUtils.isEmpty(fieldName)) {
            options.put("gridId", fieldName);
            options.put("entryName", fieldName);
        }

        // 处理readonly属性：若元素有此属性则复制，否则使用默认占位符
        if (element.getAttribute("readonly") != null) {
            TranslatorUtil.copyAttribute(element, options, "readonly");
        } else {
            options.put("readonly", "${readonly}");
        }

        // 可选属性直接拷贝到options中
        if (element.getAttribute("hasPager") != null) {
            TranslatorUtil.copyAttribute(element, options, "hasPager");
        }

        if (element.getAttribute("sortKey") != null) {
            TranslatorUtil.copyAttribute(element, options, "sortKey");
            String sortKey = element.getAttributeValue("sortKey");
            if (!StringUtils.isEmpty(sortKey)) {
                options.put("sortKey", sortKey);
            }
        }

        // 拷贝一系列通用属性至options映射中
        TranslatorUtil.copyAttribute(element, options, "editType");
        TranslatorUtil.copyAttribute(element, options, "shrinkToFit");
        TranslatorUtil.copyAttribute(element, options, "rownumbers");
        TranslatorUtil.copyAttribute(element, options, "rowNum");
        TranslatorUtil.copyAttribute(element, options, "rowList");
        TranslatorUtil.copyAttribute(element, options, "showImport");
        TranslatorUtil.copyAttribute(element, options, "showExport");
        TranslatorUtil.copyAttribute(element, options, "remoteDataSource");
        TranslatorUtil.copyAttribute(element, options, "showSearch");
        //扩展属性: 是否跳转页面
        TranslatorUtil.copyAttribute(element, options, "isShowJumpButton");

        // 特殊处理key列相关逻辑
        this.handleKeyColumn(element);

        // 获取并移除noAction与colspan属性，避免干扰后续操作
        String noAction = element.getAttributeValue("noAction");
        element.removeAttribute("noAction");
        element.removeAttribute("colspan");

        // 判断是否启用动作功能，并选择不同的容器模板进行渲染
        return "true".equalsIgnoreCase(noAction) ?
                this.convertFieldString("e", "editGrid", element, this.translateChildren(element, viewInfo, store)) :
                this.convertFieldString("e", "editGridContainer", options, this.translateChildren(element, viewInfo, store));
    }


    /**
     * 处理元素中的关键列配置
     *
     * @param element 包含列配置的元素对象
     */
    private void handleKeyColumn(Element element) {
        // 获取所有column子元素
        List columns = element.getChildren("column");
        boolean hasKey = false;
        Element column = null;
        int i = 0;

        // 遍历所有列，查找是否已存在关键列
        for (int size = columns.size(); i < size; ++i) {
            column = (Element) columns.get(i);
            if ("true".equalsIgnoreCase(column.getAttributeValue("key"))) {
                hasKey = true;
                break;
            }
        }

        // 如果没有找到关键列，则创建一个默认的关键列配置
        if (!hasKey) {
            column = new Element("column");
            column.setAttribute("name", "id");
            column.setAttribute("key", "true");
            column.setAttribute("editable", "false");
            column.setAttribute("hidden", "true");
            element.addContent(column);
        }

    }


    /**
     * 检查跨度是否已满
     *
     * @return true表示跨度已满，false表示跨度未满
     */
    public boolean isSpanFull() {
        return true;
    }


    /**
     * 检查是否需要重新布局
     *
     * @return 布局需求状态，true表示需要重新布局，false表示不需要重新布局
     */
    public boolean requireLayout() {
        return true;
    }

}
