import Vue from 'vue';
import router from '../router';
import store from '../store';
import operaList from '@/util/opera';
const _ = require('lodash');
// 实验室用
Vue.directive('opera', {
  inserted: (el, binding, vnode, oldVnode) => {
    const opera = _.get(router, 'currentRoute.meta.opera');
    // 没找到opera,就不管了
    if (!opera) return;
    // 取出指令绑定的值
    let value = _.get(binding, 'value', {});
    let method = _.get(value, 'method', 'others');
    const isInAct = store.state.isInAct;
    if (isInAct) {
      // 如果指令绑定的值不在operaList中,默认为others
      const r = operaList.find((f) => f._id === method);
      if (!r) method = 'others';
      if (!opera.includes(method)) el.style.display = 'none';
      // else {
      //   // 如果可以进行该操作,则检查数据部分是否有act_time.且和isInAct中的id是否一致,不一致不能进行改(其他时间段填写的内容不允许别的时间段改)
      //   let actTime = _.get(value, 'data.act_time');
      //   if (actTime) {
      //     let { _id: nowActId } = isInAct;
      //     if (actTime && nowActId && actTime !== nowActId) {
      //       // 数据中有actTime,当前也有处于时间段中,且这两个id并不同,则隐藏
      //       el.style.display = 'none';
      //     }
      //   }
      // }
    } else {
      // 不在正常修改时间内
      // 首先,将正常操作中,不受时间限制的项过滤出来
      const outOfActOpera = operaList.filter((f) => f.outOfAct === true);
      // 其次,将本页面可使用的操作 与 不受时间限制的操作 取交集: 即 获取本页面 不受时间限制的操作 列表
      const intersection = _.intersection(
        opera,
        outOfActOpera.map((i) => i._id)
      );
      // 最后,查看交集中是否有当前操作
      if (!intersection.includes(method)) el.style.display = 'none';
    }
  },
});

// 项目管理用
Vue.directive('use', {
  inserted: (el, binding, vnode, oldVnode) => {
    const route = _.get(router, 'currentRoute.path');
    const menu = _.get(store, 'state.user.role.menu');
    if (!route || !menu) return false;
    if (_.get(menu, 'mode') === 'all') return true;
    const rules = menu[route];
    // 不能没有这个路由的规则,即使规则是空的.也是存在的
    if (!rules) el.style.display = 'none';
    const { mode, opera } = rules;
    // 全可以
    if (mode === 'allow') return true;
    // 全禁止
    else if (mode === 'refuse') el.style.display = 'none';
    // 选择性
    else {
      const code = _.get(binding, 'value');
      if (!code) el.style.display = 'none';
      const r = opera.find((f) => f === code);
      if (!r) el.style.display = 'none';
    }
  },
});
