import util from '@/libs/util'

/**
 * 将后端返回的扁平菜单数组转为 { header: [], aside: [] } 树结构
 * @param {Array} arr 后端返回的扁平菜单数据
 */
function getMenuData (arr) {
  const tree = { header: [], aside: [] }

  arr.forEach(value => {
    if (!value.is_navi) {
      return
    }

    const menuItem = {
      path: value.url || ('d2-menu-empty-' + value.menu_id),
      title: value.name,
      icon: value.icon,
      type: value.type,
      params: value.params,
      remark: value.remark || ''
    }

    // parent_id 为 0 的节点放入顶栏
    if (value.parent_id === 0) {
      tree.header.push({ ...menuItem })
    }

    // 所有节点保留 menu_id / parent_id 用于构建侧栏树形结构
    menuItem.menu_id = value.menu_id
    menuItem.parent_id = value.parent_id
    tree.aside.push(menuItem)
  })

  // 扁平 aside 数组转为嵌套树
  tree.aside = util.formatDataToTree(tree.aside)

  return tree
}

export default {
  /**
   * 由 sourceDataLoad 调用，将菜单源数据写入 store
   * @param {Object} vm vuex store 实例 (this)
   * @param {Array} source 后端返回的扁平菜单数组
   */
  install (vm, source) {
    vm.commit('d2admin/menu/headerAuth', source)
    const { header, aside } = getMenuData(source)
    vm.commit('d2admin/menu/headerSet', header)
    vm.commit('d2admin/menu/asideSet', aside)
  }
}
