import { login, logout, userinfo, menuList } from '@/apis/user'
// const { asyncRoutes, constantRoutes } = require('@/router')
// import { superManRoutes } from "@/router/static/superMan"
import {
  getToken,
  setToken,
  removeToken,
  getMenu,
  setMenu,
  removeMenu,
  getBtn,
  setBtn,
  removeBtn
} from '@/utils/auth'

const state = {
  token: getToken(),
  name: '',
  avatar: require('@/assets/img/avatar.gif'),
  introduction: '',
  roles: ['admin'],
  btnList: getBtn(),
  navList: getMenu(),
}

const mutations = {
  SET_TOKEN: (state, token) => {
    state.token = token
  },
  SET_MENU: (state, menu) => {
    state.menu = menu
  },
  SET_HAS: (state, has) => {
    state.has = has
  },
  SET_INTRODUCTION: (state, introduction) => {
    state.introduction = introduction
  },
  SET_NAME: (state, name) => {
    state.name = name
  },
  SET_AVATAR: (state, avatar) => {
    state.avatar = avatar
  },
  SET_ROLES: (state, roles) => {
    state.roles = roles
  },
  navListFn(state, val) {
    if (!val) {
      val = [];
    }
    state.navList = val;
    setMenu(val)
  },
  btnListFn(state, val) {
    if (!val) {
      val = [];
    }
    state.btnList = val
    setBtn(val)

  },
}

const actions = {
  // user login
  login({ commit }, userInfo) {
    const { username, password } = userInfo
    return new Promise((resolve, reject) => {
      login({ username: username.trim(), passwd: password })
        .then(response => {
          const { data } = response
          if (response.code === 0) {
            commit('SET_TOKEN', data.token)
            setToken(data.token)
          }
          resolve(response)
        })
        .catch(error => {
          // console.log(error);
          reject(error)
        })
    })
  },
  async getMenuList({ commit, that }) {
    return new Promise(async (resolve, reject) => {
      if (!getToken()) {
        resolve("noToken")
      } else {
        let res = await menuList({})
        if (res.code === 0) {
          let list = res.data
          list = list.filter((item) => item.child && item.child.length > 0)
          let arrag = []
          let btnList = []
          console.log(list)
          list.forEach(v1 => {
            let pItem = {
              name: v1.menu_route,
              path: `/${v1.menu_route}`,
              meta: {
                title: v1.menu_name,
                icon: v1.menu_img
              },
              children: []
            }
            v1.child.forEach(v2 => {
              let item = {
                path: v2.menu_route,
                name: v2.menu_route,
                meta: {
                  title: v2.menu_name,
                  icon: v2.menu_img
                },
                url: v2.menu_url
              }
              let model = {
                menu_route: v2.menu_route,
                action: v2.action
              }
              btnList.push(model)
              pItem.children.push(item)
            })
            arrag.push(pItem)
          })


          //登录页
          console.log(arrag);
          // 生成页面权限
          commit("navListFn", arrag);
          // 生成按钮权限
          commit("btnListFn", btnList);
          // 生成路由
          initRouter(arrag, that);
          // state.commit("loginInfoCommit", res.data);
          resolve("success")
        } else if (res.code === 101 || res.code === 102) {
          resolve("noToken")
        } else {
          resolve(res)
        }
      }
    })
  },



  // user logout
  logout({ commit, state, dispatch }) {
    return new Promise((resolve, reject) => {
      commit('SET_TOKEN', '')
      commit('SET_ROLES', [])
      removeToken()
      commit('SET_MENU', '')
      commit('SET_HAS', '')

      removeMenu()
      removeBtn()
      // reset visited views and cached views
      // to fixed https://github.com/PanJiaChen/vue-element-admin/issues/2485
      dispatch('tagsView/delAllViews', null, { root: true })
      resolve()
    })
  },

  // remove token
  resetToken({ commit }) {
    return new Promise(resolve => {
      commit('SET_TOKEN', '')
      commit('SET_ROLES', [])
      removeToken()
      resolve()
    })
  },


}



function initRouter(arr) {
  const IndexRoute = [

    // 个人信息
    {
      path: '/person',
      component: () => import('@/layout/index'),
      redirect: '/person/my-message',
      hidden: true,
      alwaysShow: true,
      meta: {
        title: '个人中心',
        icon: 'user'
      },
      children: [
        {
          path: 'my-message',
          component: () => import('@/views/person-infor/my-message'),
          name: 'MyMessage',
          alwaysShow: true,
          meta: { title: '我的信息', noCache: true, breadcrumb: true }
        },
        {
          path: 'change-phone',
          component: () => import('@/views/person-infor/change-phone'),
          name: 'ChangePhone',
          alwaysShow: true,
          meta: { title: '更换手机号', noCache: true, breadcrumb: true }
        },
        {
          path: 'change-password',
          component: () => import('@/views/person-infor/change-password'),
          name: 'ChangePassword',
          alwaysShow: true,
          meta: { title: '修改密码', noCache: true, breadcrumb: true }
        }
      ]
    },
    //欢迎页
    {
      path: '/welcome',
      component: () => import('@/layout/index'),
      redirect: '/welcome/dashboard',
      children: [
        {
          path: 'dashboard',
          component: () => import('@/views/dashboard/index'),
          name: 'Dashboard',
          meta: { title: '首页', icon: 'dashboard', affix: true }
        },
      ]
    },
  ];

  arr.map(v1 => {
    v1.component = (resolve) => require([`@/layout/index.vue`], resolve)
    if (v1.children && v1.children.length > 0) {
      v1.redirect = `/${v1.name}/${v1.children[0].name}`
      v1.children.map(v2 => {
        v2.component = (resolve) => require([`@/views/${v2.url}.vue`], resolve)
        return v2
      })
    }
    return v1
  })
  IndexRoute.push(...arr)
  IndexRoute.push({
    path: '404',
    component: () => import('@/views/error-page/404'),
    hidden: false,
    noCache: true
  })

  IndexRoute.push({
    path: "*",
    redirect: '/404',
  })
  console.log(IndexRoute);
  window.vm.$router.addRoutes(IndexRoute);
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}
