import Vue from "vue";
import utils from "@/hotent-ui-util.js";
import FormMath from "@/math.js";
import dialog from "@/api/dialogApi.js";
// import CustomQuery from "@/components/eipControl/bus/CustomQuery.js";
import _ from "lodash";
import req from "@/request.js"
import app from "@/main.js";
// 表单tr中根据隐藏字段动态合并单元格的指令
Vue.directive('pinyin', {
    // 指令的定义
    componentUpdated: function (el, binding, vnode) {
        let context = vnode.context;
        // 防抖
        let debounceGetPinyin = _.debounce((newVal) => {
            // disabled 或者 readonly 时 不需要请求
            if (el.__vue__.disabled || el.__vue__.readonly) return;
            req.request({
                url: `${window.context.uc}/base/tools/v1/getPinyin`,
                method: "GET",
                params: { chinese: newVal, type: `${binding.modifiers.full ? 1 : 0}` }
            }).then(res => {
                if (res.data.state) {
                    let modelExp = vnode.data.model.expression.replace(/\[\w+.?\$\w+\]/g, "[" + binding.arg + "]")
                    utils.setValueByPath(context, modelExp, res.data.value);
                    app.$nextTick(() => {
                        app.$validator.validate();
                    })
                }
            }).finally(() => {
            });
        }, 300);
        if (binding.value && binding.value != binding.oldValue) {
            debounceGetPinyin(binding.value);
        }
        // context.$watch(watchExp(), function (newVal, oldVal) {
        // 	if (newVal && newVal != oldVal) {
        // 		debounceGetPinyin(newVal);
        // 	}
        // }, {
        // 	deep: true,
        // 	immediate: false
        // });
    }
});
Vue.directive('permit', {
    componentUpdated: function (el, binding) {
        if (el.tagName !== "TR") {
            throw "v-permit指令只能用在tr元素上.";
        }
        if (!binding.value || binding.value.constructor !== Number) {
            throw "v-permit指令的值只能是大于0的数字.";
        }
        el.removeAttribute("hidden");
        // tr中没有子元素时,删除tr自身
        if (el.cells.length == 0) {
            el.setAttribute("hidden", "hidden");
        }
        else if (el.cells.length < binding.value) {
            let colspan = binding.value - el.cells.length + 1;
            // 设置colspan实现单元格合并
            el.cells[el.cells.length - 1].setAttribute("colspan", colspan);
        }
        else if (el.cells.length === binding.value) {
            for (var i = 0, c; c = el.cells[i++];) {
                c.removeAttribute("colspan");
            }
        }
    }
});
// 表单指令,会在表单的vue实例上添加一个map,用以存放数学运算的表达式
Vue.directive('form', {
    bind: function (el, binding, vnode) {
        const inst = vnode.context;
        if (inst && !inst.hasOwnProperty("watchMap")) {
            inst["watchMap"] = new Map();
        }
    }
});
// 判断输入框是否作为计算字段,是则添加监听
Vue.directive('express', {
    componentUpdated: function (el, binding, vnode) {
        const inst = vnode.context;
        if (!inst.$vnode.data.model) {
            return;
        }
        const elAttr = inst.$vnode.componentOptions.propsData.modelExpression;
        if (elAttr && !inst._expressInit) {
            inst._expressInit = true;
            // 子表每一行数据作用域所在的dom元素
            let { subScopeEl } = utils.getSubScopeElAndIndex(el);
            let subname = null;
            let aliasElAttr = null;
            // 子表数据,需要找到配置了data-subname的元素
            if (subScopeEl) {
                subname = subScopeEl.dataset["subname"];
                if (!subname) {
                    throw ("无法获取到当前子表前缀");
                }
                const elAttrAry = elAttr.split("."), elAttrArySize = elAttrAry.length;
                if (elAttrArySize < 1) {
                    throw `子表中的数据绑定表达式${elAttr}错误`;
                }
                aliasElAttr = `${subname}.${elAttrAry[elAttrArySize - 1]}`;
            }
            const p = utils.getOnlineFormInstance(inst);
            if (p.watchMap && (p.watchMap.has(elAttr) || p.watchMap.has(aliasElAttr))) {
                if (!inst._watchers.some((m) => {
                    return m.expression === 'inputVal'
                })) {
                    inst.$watch("inputVal", function (newVal, oldVal, farewell) {
                        if (newVal !== oldVal) {
                            const expList = p.watchMap.get(elAttr) || p.watchMap.get(aliasElAttr);
                            expList.forEach(item => {
                                let result = 0;
                                const t = item.target;
                                // 当在子表单行中时,而且不是对子表进行列运算时,判定为子表当前行内运算
                                if (subScopeEl && !/.*?\[\{.*?\}\].*?/.test(item.exp)) {
                                    // 组件销毁时,不再计算子表单行的公式
                                    if (farewell) {
                                        return;
                                    }
                                    const index = subScopeEl.dataset["index"];
                                    if (index === undefined) {
                                        throw ("获取不到当前子表行的索引,无法完成计算.");
                                    }
                                    result = FormMath.calcSubExpValue(item.exp, p, subname, index);
                                    p.$emit(t, { result, index });
                                }
                                else {
                                    result = FormMath.calcExpValue(item.exp, p);
                                    p.$emit(t, { result });
                                }
                            });
                        }
                    }, { immediate: true });
                }
            }
        }
    }
});
// 自定义对话框 v-auth-set-event
Vue.directive('auth-set-event', {
    bind: function (el, bindings, vnode) {
        const htAuthSetEvent = el.getAttribute("attr");
        if (!htAuthSetEvent) return;
        var defaultPermissionList = [];
        dialog.getPermissionList(result => {
            defaultPermissionList = result;
        });
        /**
         * 设置设置权限。
         * ownerNameJson 格式。
         * [{type:"everyone",title:"所有人"},{type:"user",title:"用户",id:"1,2",name:"ray,tom"}]
         */
        const setAuth = function () {
            var conf = {
                right: ownerNameJson,
                permissionList: defaultPermissionList
            }
            //授权选择器
            vnode.child.AuthSettingShow(conf);
        }
        var ownerNameJson = [];
        var initData = bindings.value;
        if (initData) {
            ownerNameJson = JSON.parse(initData);;
            // showLable(ownerNameJson);
        }
        //对话框初始化监听
        el.childNodes[2].onclick = function () {
            setAuth();
        }
    }
});
Vue.directive('parseTemplete', {
    bind: function (el, binding, vnode) {
        var s = JSON.stringify
        el.innerHTML =
            'name: ' + s(binding.name) + '
' +
            'value: ' + s(binding.value) + '
' +
            'expression: ' + s(binding.expression) + '
' +
            'argument: ' + s(binding.arg) + '
' +
            'modifiers: ' + s(binding.modifiers) + '
' +
            'vnode keys: ' + Object.keys(vnode).join(', ')
    }
});
Vue.directive('alsCharts', {
    inserted(el, binding, vnode) {
        const inst = binding.context;
        function init(data) {
            if (!(data.value && data.value !== true && data.value.constructor == Array && data.value[0].legend)) {
                return;
            }
            var options = data.value[0];
            var height = getDivHeight(el) - 35;
            var wrap = $('
| ' + series[j].data[i] + ''; //组装表数据 } var curColor = colors[i % 2]; table += ' | 
| ' + axisData[i] + '' + tdBodys + ' |