import { CodeListServiceBase, ModelTool, Util } from '@ibizstudio/runtime';
import { MDControlBase } from './md-control-base';
import { AppTreeGridExService } from '../ctrl-service';
/**
 * 树表格部件基类
 *
 * @export
 * @class TreeGridExControlBase
 * @extends {MDControlBase}
 */
export class TreeGridExControlBase extends MDControlBase {
    constructor() {
        super(...arguments);
        /**
         * 数据集合
         *
         * @public
         * @type {any[]}
         * @memberof TreeGridExControlBase
         */
        this.items = [];
        /**
         * 默认展开节点集合
         *
         * @memberof TreeGridExControlBase
         */
        this.defExpands = [];
        /**
         * 行节点下标
         *
         * @memberof TreeGridExControlBase
         */
        this.itemNum = {};
        /**
         * 计数下标
         *
         * @memberof TreeGridExControlBase
         */
        this.num = 0;
        /**
         * 过滤属性
         *
         * @type {string}
         * @memberof TreeGridExControlBase
         */
        this.srfnodefilter = '';
        /**
         * 代码表数据
         *
         * @memberof TreeGridExControlBase
         */
        this.codeListData = new Map();
    }
    /**
     * 初始化部件数据
     *
     * @memberof TreeGridExControlBase
     */
    async ctrlModelInit() {
        await super.ctrlModelInit();
        this.service = new AppTreeGridExService(this.controlInstance, this.context);
        await this.initColumnsCodeList();
    }
    /**
     * 初始化列代码表
     *
     * @public
     * @memberof TreeGridExControlBase
     */
    async initColumnsCodeList() {
        let _this = this;
        this.codeListData = new Map();
        this.codeListService = new CodeListServiceBase({ $store: _this.$store });
        const allTreeNodes = this.controlInstance.getPSDETreeNodes() || [];
        for (let i = 0; i < allTreeNodes.length; i++) {
            const dataItems = allTreeNodes[i].getPSDETreeNodeDataItems() || [];
            if (dataItems && dataItems.length > 0) {
                for (let j = 0; j < dataItems.length; j++) {
                    const dataItem = dataItems[j];
                    if (dataItem.getFrontPSCodeList && dataItem.getFrontPSCodeList()) {
                        const codelistJson = dataItem.getFrontPSCodeList();
                        await (codelistJson === null || codelistJson === void 0 ? void 0 : codelistJson.fill());
                        if (codelistJson) {
                            let items = await this.codeListService.getDataItems({ type: codelistJson.codeListType, tag: codelistJson.codeName, data: codelistJson, context: this.context });
                            this.codeListData.set(dataItem.name, items);
                        }
                    }
                }
            }
        }
    }
    /**
     * 执行created后的逻辑
     *
     * @memberof TreeGridExControlBase
     */
    ctrlInit() {
        super.ctrlInit();
    }
    viewStateAction(tag, action, data) {
        if (!Object.is(tag, this.name)) {
            return;
        }
        super.viewStateAction(tag, action, data);
        if (Object.is('load', action)) {
            this.load(data);
        }
        if (Object.is('filter', action)) {
            this.srfnodefilter = data.srfnodefilter;
            this.refresh();
        }
    }
    /**
     * 加载数据
     *
     * @param {*} [node={}] 节点数据
     * @param {*} [resolve] 渲染回调
     * @memberof TreeGridExControlBase
     */
    load(node = {}, resolve) {
        const params = {
            srfnodeid: node && node.id ? node.id : '#',
            srfnodefilter: this.srfnodefilter,
        };
        let tempViewParams = Util.deepCopy(this.viewparams);
        let curNode = {};
        Util.deepObjectMerge(curNode, node);
        let tempContext = this.computecurNodeContext(curNode);
        if (curNode && curNode.srfparentdename) {
            Object.assign(tempContext, { srfparentdename: curNode.srfparentdename });
            Object.assign(tempViewParams, { srfparentdename: curNode.srfparentdename });
        }
        if (curNode && curNode.srfparentdemapname) {
            Object.assign(tempContext, { srfparentdemapname: curNode.srfparentdemapname });
            Object.assign(tempViewParams, { srfparentdemapname: curNode.srfparentdemapname });
        }
        if (curNode && curNode.srfparentkey) {
            Object.assign(tempContext, { srfparentkey: curNode.srfparentkey });
            Object.assign(tempViewParams, { srfparentkey: curNode.srfparentkey });
        }
        Object.assign(params, { viewparams: tempViewParams });
        this.onControlRequset('load', tempContext, params);
        this.service
            .getNodes(tempContext, params)
            .then((response) => {
            this.onControlResponse('load', response);
            if (!response || response.status !== 200) {
                this.$throw(response.info, 'load');
                return;
            }
            response.data.forEach((item) => {
                this.itemNum[item.id] = this.num++;
                if (item.expanded) {
                    this.defExpands.push(item);
                }
            });
            if (resolve && resolve instanceof Function) {
                resolve(response.data);
            }
            else {
                this.items = [...response.data];
            }
            this.$nextTick(() => {
                this.expandDefNode();
            });
            this.ctrlEvent({ controlname: this.controlInstance.name, action: 'load', data: this.items });
        })
            .catch((response) => {
            this.onControlResponse('load', response);
            this.$throw(response, 'load');
        });
    }
    /**
     * 刷新
     *
     * @param {*} [args] 额外参数
     * @memberof TreeGridExControlBase
     */
    refresh(args) {
        this.load();
    }
    /**
     * 加载事件
     *
     * @param {*} row 行数据
     * @param {*} treeNode 节点信息
     * @param {*} resolve 渲染回调
     * @memberof TreeGridExControlBase
     */
    loadTreeNode(row, treeNode, resolve) {
        this.load(row, resolve);
    }
    /**
     * 当前选中变化事件
     *
     * @param {*} $event 行数据
     * @return {*}
     * @memberof TreeGridExControlBase
     */
    select($event) {
        if (!$event) {
            return;
        }
        this.selections = [Util.deepCopy($event)];
        this.ctrlEvent({ controlname: this.controlInstance.name, action: 'selectionchange', data: this.selections });
    }
    /**
     * 设置行Class
     *
     * @returns
     * @memberof TreeGridExControlBase
     */
    setRowClass({ row, rowIndex }) {
        return 'treegrid' + this.itemNum[row.id];
    }
    /**
     * 展开默认节点
     *
     * @returns
     * @memberof TreeGridExControlBase
     */
    expandDefNode() {
        var _a;
        if (this.defExpands.length > 0) {
            let item = this.defExpands[0];
            this.defExpands.splice(0, 1);
            let trs = this.$el.getElementsByClassName('treegrid' + this.itemNum[item.id]);
            if (trs && trs.length > 0) {
                let icons = trs[0].getElementsByClassName('el-table__expand-icon');
                (_a = icons[0]) === null || _a === void 0 ? void 0 : _a.click();
            }
        }
    }
    /**
     * 绘制列
     *
     * @returns
     * @memberof TreeGridExControlBase
     */
    renderColumns() {
        var _a;
        const treeColumns = this.controlInstance.getPSDETreeColumns() || [];
        if (treeColumns.length > 0) {
            return treeColumns.map((column) => {
                var _a;
                column.widthUnit != 'STAR';
                const props = {
                    'show-overflow-tooltip': true,
                    label: this.$tl((_a = column.getCapPSLanguageRes()) === null || _a === void 0 ? void 0 : _a.lanResTag, column.caption),
                    align: column.align ? column.align.toLowerCase() : '',
                };
                if (column.widthUnit != 'STAR') {
                    props['width'] = column.width;
                }
                else {
                    props['min-width'] = column.width;
                }
                return this.$createElement('el-table-column', {
                    props: props,
                    scopedSlots: {
                        default: (row) => {
                            if (column === null || column === void 0 ? void 0 : column.getRenderPSSysPFPlugin()) {
                                let plugin = column.getRenderPSSysPFPlugin();
                                const pluginInstance = this.PluginFactory.getPluginInstance('CONTROLITEM', plugin.pluginCode);
                                if (pluginInstance) {
                                    return pluginInstance.renderCtrlItem(this.$createElement, column, this, row);
                                }
                            }
                            else {
                                return <span>{this.getColumnValue(row, column.name)}</span>;
                            }
                        },
                    },
                });
            });
        }
        else {
            const majorField = ModelTool.getAppEntityMajorField(this.controlInstance.getPSAppDataEntity());
            const props = {
                'show-overflow-tooltip': true,
                label: majorField ? this.$tl((_a = majorField.getLNPSLanguageRes()) === null || _a === void 0 ? void 0 : _a.lanResTag, majorField.logicName) : this.$t('app.commonwords.srfmajortext'),
                align: 'center',
                width: 200,
            };
            return this.$createElement('el-table-column', {
                props: props,
                scopedSlots: {
                    default: (row) => {
                        var _a;
                        return <span>{(_a = row === null || row === void 0 ? void 0 : row.row) === null || _a === void 0 ? void 0 : _a['srfmajortext']}</span>;
                    },
                },
            });
        }
    }
    /**
     * 获取列属性值
     *
     * @public
     * @memberof TreeGridExControlBase
     */
    getColumnValue(task, field) {
        const { row } = task;
        if (row.curData) {
            Object.assign(row, row.curData);
        }
        const allTreeNodes = this.controlInstance.getPSDETreeNodes() || [];
        const node = allTreeNodes === null || allTreeNodes === void 0 ? void 0 : allTreeNodes.find((_node) => {
            return row.id.split(';')[0] == _node.nodeType;
        });
        const dataItems = (node === null || node === void 0 ? void 0 : node.getPSDETreeNodeDataItems()) || [];
        if ((dataItems === null || dataItems === void 0 ? void 0 : dataItems.length) > 0) {
            const dataItem = dataItems.find((_item) => {
                return _item.name == field;
            });
            if (dataItem) {
                const codelistData = this.codeListData.get(dataItem.name);
                if (codelistData) {
                    const item = codelistData.find((item) => {
                        return item.value == row[field];
                    });
                    if (item) {
                        return item.text;
                    }
                }
            }
        }
        return row[field];
    }
    /**
     * 计算当前节点的上下文
     *
     * @param {*} curNode 当前节点
     * @memberof TreeGridExControlBase
     */
    computecurNodeContext(curNode) {
        let tempContext = {};
        if (curNode === null || curNode === void 0 ? void 0 : curNode.srfappctx) {
            tempContext = Util.deepCopy(curNode.srfappctx);
        }
        else {
            tempContext = Util.deepCopy(this.context);
        }
        return tempContext;
    }
}
