import util from '@/libs/util.js'
import { loginAdminUser, logoutAdminUser } from '@/api/auth'

import { MessageBox, Loading } from 'element-ui'
import router from '@/router'

export default {
  namespaced: true,
  actions: {
    /**
     * @description 登录
     * @param {Object} context
     * @param {Object} payload username {String} 用户账号
     * @param {Object} payload password {String} 密码
     * @param {Object} payload route {Object} 登录成功后定向的路由对象 任何 vue-router 支持的格式
     */
    async login ({ dispatch }, {
      username = '',
      password = ''
    } = {}) {
      // 新的写法
      const res = await loginAdminUser({ username, password })
      // 设置用户数据
      const cookieSetting = { expires: 365 }
      util.cookies.set('uuid', res.userInfo.username, cookieSetting)
      util.cookies.set('token', res.token, cookieSetting)
      util.cookies.set('block', 'false')

      // 存储用户数据到本地
      localStorage.setItem('user_id', res.userInfo.user_id)

      // 设置 vuex 用户信息
      await dispatch('d2admin/user/set', {
        name: res.userInfo.username,
        admin: res.userInfo,
        token: res.token
      }, { root: true })

      // 用户登录后从持久化数据加载一系列的设置
      await dispatch('load')
    },
    /**
     * @description 注销用户并返回登录页面
     * @param {Object} context
     * @param {Object} payload confirm {Boolean} 是否需要确认
     */
    logout ({ dispatch }, { confirm = false } = {}) {
      // 加载遮罩
      let loading = null
      // 实际注销操作
      function doLogout () {
        logoutAdminUser()
          .finally(() => {
            // 删除sourceData
            util.cookies.set('block', 'true')
            dispatch('d2admin/db/set', {
              dbName: 'database',
              path: '$menu.sourceData',
              value: [],
              user: true
            }, { root: true })

            // 删除info
            dispatch('d2admin/user/set', {}, { root: true })

            // 删除cookie
            util.cookies.remove('token')
            util.cookies.remove('uuid')

            // 刷新页面
            loading && loading.close()
            router.push({ name: 'login' })
          })
          .catch(() => {
          })
      }

      if (!confirm) {
        doLogout()
        return
      }

      MessageBox.confirm('确定要执行注销操作吗?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning',
        closeOnClickModal: false
      })
        .then(() => {
          loading = Loading.service({
            lock: true,
            text: 'Loading',
            spinner: 'el-icon-loading',
            background: 'rgba(0, 0, 0, 0.7)'
          })
          doLogout()
        })
        .catch(() => {
        })
    },
    /**
     * @description 用户登录后从持久化数据加载一系列的设置
     * @param {Object} context
     */
    async load ({ dispatch }) {
      // 加载用户名
      await dispatch('d2admin/user/load', null, { root: true })
      // 加载主题
      await dispatch('d2admin/theme/load', null, { root: true })
      // 加载页面过渡效果设置
      await dispatch('d2admin/transition/load', null, { root: true })
      // 持久化数据加载上次退出时的多页列表
      await dispatch('d2admin/page/openedLoad', null, { root: true })
      // 持久化数据加载侧边栏配置
      await dispatch('d2admin/menu/asideLoad', null, { root: true })
      // 持久化数据加载全局尺寸
      await dispatch('d2admin/size/load', null, { root: true })
      // 持久化数据加载颜色设置
      await dispatch('d2admin/color/load', null, { root: true })
      // DB -> store 持久化数据读取菜单源数据
      await dispatch('d2admin/menu/sourceDataLoad', null, { root: true })
    }
  }
}
