import Vue from 'vue'
import Router from 'vue-router'

// in development-env not use lazy-loading, because lazy-loading too many pages will cause webpack hot update too slow. so only in production use lazy-loading;
// detail: https://panjiachen.github.io/vue-element-admin-site/#/lazy-loading

Vue.use(Router)

/* Layout */
import Layout from '../views/layout/Layout'
import { getMenuList } from '../api/menulist-api'

/**
* hidden: true                   if `hidden:true` will not show in the sidebar(default is false)
* alwaysShow: true               if set true, will always show the root menu, whatever its child routes length
*                                if not set alwaysShow, only more than one route under the children
*                                it will becomes nested mode, otherwise not show the root menu
* redirect: noredirect           if `redirect:noredirect` will no redirct in the breadcrumb
* name:'router-name'             the name is used by <keep-alive> (must set!!!)
* meta : {
    title: 'title'               the name show in submenu and breadcrumb (recommend set)
    icon: 'svg-name'             the icon show in the sidebar,
  }
**/
// 全局路由
const globalRouter = [
  { path: '/login', component: () => import('@/views/login/index'), hidden: true },
  { path: '/404', component: () => import('@/views/404'), hidden: true }
]
// 主页路由
const mainRouter = {
  path: '/',
  component: Layout,
  redirect: '/dashboard',
  hidden: true,
  children: [{
    path: 'dashboard',
    component: () => import('@/views/dashboard/index'),
    name: 'Dashboard',
    meta: { title: 'Dashboard', icon: 'dashboard', noCache: true }
  }]
}
// 菜单路由
const menuRouter = []

const constantRouterMap = globalRouter.concat(mainRouter).concat(menuRouter)

const router = new Router({
  // mode: 'history', //后端支持可开
  scrollBehavior: () => ({ y: 0 }),
  hasLoadedDynamicRoutes: false, // 动态路由已加载
  routes: constantRouterMap
})

router.beforeEach((to, from, next) => {
  if (router.options.hasLoadedDynamicRoutes) {
    next()
  } else {
    getMenuList().then(response => {
      const menuList = initDynamicRouters(response.items)
      router.options.routes.push(...menuList)
      router.addRoutes(menuList)
      router.addRoutes([{ path: '*', redirect: '/404', hidden: true }])
      router.options.hasLoadedDynamicRoutes = true
      next({ ...to, replace: true })
    })
  }
})
function getMenuResource(resource) {
  let menuresource = resource
  if (menuresource && menuresource.startsWith('/views/')) {
    menuresource = menuresource.substring(6)
  }
  return menuresource
}
function getChildren(menus) {
  const children = []
  for (const menu of menus) {
    const menuresource = getMenuResource(menu.resource)
    const route = {
      path: menu.path,
      name: menu.code,
      component: () => import('@/views' + menuresource),
      meta: menu.meta,
      children: menu.children ? getChildren(menu.children) : null
    }
    children.push(route)
  }
  return children.length > 0 ? children : null
}

function initDynamicRouters(menus) {
  const menuList = []
  if (menus && menus.length > 0) {
    for (const menu of menus) {
      const route = {
        path: menu.path,
        component: Layout,
        // alwaysShow: true,
        redirect: menu.path + '/' + ((menu.children && menu.children.length > 0) ? menu.children[0].path : null),
        name: menu.code,
        meta: menu.meta,
        children: menu.children ? getChildren(menu.children) : null
      }
      menuList.push(route)
    }
  }
  return menuList
}

export default router
