import {
  getToken,
  setToken,
  removeToken
} from '@/utils/auth'
import {
  loginIn,
  getUserInfo,
  loginOut
} from '@/api/login'
import {
  defaultRoutes,
  asyncRoutes,
  developerRoutes
} from '@/router/auth'
/*
 *权限出错时本地解决步骤
 * 1. 开启下面注释 import { asyncRoutes } from '@/router/auth'
 * 2. 注释 let permissions = JSON.parse(role.permissions)
 * 3. 打开注释 const copyRoures = JSON.parse(JSON.stringify(asyncRoutes))
 * 4. 修改 permissions = copyDefatleRoutes.concat(permissions) 为 const permissions = copyDefatleRoutes.concat(asyncRoutes)
 * 5. 切换为本地路由，修改角色
 */
// import {
//   asyncRoutes
// } from '@/router/auth'

/**
 * addRoutes 方法仅仅是帮你注入新的路由，并没有帮你剔除其它路由！
 * 设想存在这么一种情况：用户在自己电脑上登录了管理员账号，这个时候会向路由中注入管理员的路由，然后再退出登录，保持页面不刷新，改用普通用户账号进行登录，这个时候又会向路由中注入普通用户的路由，那么，在路由中将存在两种用户类型的路由，即使用户不感知，通过改变 url，普通用户也可以访问管理员的页面
 * 对于这个问题，也有一个解决办法：resetRouter()
 */
import { resetRouter } from '@/router'

const state = {
  token: getToken(),
  id: '',
  name: '',
  avatar: '',
  role_id: '',
  role_name: '',
  routes: []
}

const mutations = {
  SET_TOKEN: (state, token) => {
    state.token = token
  },
  SET_NAME: (state, name) => {
    state.name = name
  },
  SET_ROUTES: (state, routes) => {
    state.routes = routes
  },
  SET_ROLEID: (state, role_id) => {
    state.role_id = role_id
  },
  SET_ROLENAME: (state, role_name) => {
    state.role_name = role_name
  },
  SET_ID: (state, id) => {
    state.id = id
  },
  SET_AVATAR: (state, avatar) => {
    state.avatar = avatar
  }
}

const actions = {
  // 登陆
  login({ commit }, userInfo) {
    const { username, password } = userInfo
    return new Promise((resolve, reject) => {
      loginIn({
        name: username,
        password
      }).then(res => {
        try {
          const { message, code, data } = res
          if (code === 200) {
            commit('SET_TOKEN', data)
            setToken(data)
            resolve()
          } else {
            reject(message)
          }
        } catch (e) {
          let message = res.message ? res.message : e.message
          message = e.message ? e.message : '请求失败'
          reject(message)
        }
      }).catch(() => {
        reject()
      })
    })
  },

  // 获取用户信息
  getInfo({ commit, state, dispatch }) {
    return new Promise((resolve, reject) => {
      getUserInfo().then(res => {
        // 写死用户头像值
        const avatar = 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif'
        try {
          resetRouter()
          const { message, code, data } = res
          if (code === 200) {
            const { name, id, role } = data
            let permissions
            // 深拷贝普通路由（如果不深拷贝,直接使用defaultRoutes,defaultRoutes会进行转化,在退出又登录后报错）
            const copyDefatleRoutes = JSON.parse(JSON.stringify(defaultRoutes))
            if (role.name === 'root') {
              permissions = copyDefatleRoutes.concat(JSON.parse(JSON.stringify(asyncRoutes))).concat(JSON.parse(JSON.stringify(developerRoutes)))
            } else {
              // permissions转json(string->json)
              permissions = JSON.parse(role.permissions)
              // 完整路由 = 普通路由 + 权限路由
              // const copyRoures = JSON.parse(JSON.stringify(asyncRoutes))
              permissions = copyDefatleRoutes.concat(permissions)
            }
            // 角色路由
            commit('SET_ROUTES', permissions)
            // 用户名
            commit('SET_NAME', name)
            // 用户id
            commit('SET_ID', id)
            // 角色名
            commit('SET_ROLENAME', role.name)
            // 角色id
            commit('SET_ROLEID', role.id)
            // 用户头像
            commit('SET_AVATAR', avatar)
            // 返回路由
            resolve({
              routes: permissions
            })
          } else {
            // 获取用户信息失败,退出登录
            commit('SET_TOKEN', '')
            commit('SET_ROUTES', [])
            removeToken()
            dispatch('tagsView/delAllViews', null, { root: true })
            reject(message)
          }
        } catch (e) {
          // 获取用户信息失败,退出登录
          commit('SET_TOKEN', '')
          commit('SET_ROUTES', [])
          removeToken()
          dispatch('tagsView/delAllViews', null, { root: true })
          let message = res.message ? res.message : e.message
          message = e.message ? e.message : '请求失败'
          reject(message)
        }
      })
    })
  },

  // 退出登录
  logout({ commit, state, dispatch }) {
    return new Promise((resolve, reject) => {
      loginOut({
        token: state.token
      }).then(res => {
        try {
          const { message, code } = res
          if (code === 200) {
            commit('SET_TOKEN', '')
            commit('SET_ROUTES', [])
            removeToken()
            resetRouter()
            dispatch('tagsView/delAllViews', null, { root: true })
            resolve()
          } else {
            reject(message)
          }
        } catch (e) {
          reject(e)
        }
      }).catch((error) => {
        reject(error)
      })
    })
  },

  // 删除token
  resetToken({ commit }) {
    return new Promise(resolve => {
      commit('SET_TOKEN', '')
      commit('SET_ROUTES', [])
      removeToken()
      resetRouter()
      resolve()
    })
  }
}

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