import Vue from 'vue';
import Vuex from 'vuex';
import axios from 'axios';
import _ from 'lodash';
import { Notification } from 'element-ui';
const jwt = require('jsonwebtoken');
Vue.use(Vuex);
const api = {
  interface: `/api/auth/login`,
  getUser: `/api/auth/token`,
  logout: '/api/auth/logout',
  getMenu: `/api/auth/user/menus`,
  updatePassword: '/api/user/pwd_edit',
};
const state = () => ({});
const mutations = {};

const actions = {
  /**
    user:Object required 登陆信息 
    router:router 如果跳转就传
    path:String 跳转到的路由位置
    needReturn: Boolean 是否返回结果
    typeCheck: Boolean 是否检查身份对应匹配的前端项目
    isWx: Boolean 是否是微信登陆
    needNotice:Boolean 是否需要提示
   */
  async login({ commit, dispatch }, { user, router, path = '/', needReturn = false, typeCheck = false, isWx = false, needNotice = true }) {
    let res;
    //wx登陆,openid存在,user中是openid和qrcode;正常登陆,user中是mobile和passwd
    if (isWx) res = await this.$axios.$post(`${api.wxLogin}`, user);
    else res = await this.$axios.$post(`${api.interface}`, user);
    const setUser = async (token, commit) => {
      localStorage.setItem('token', token);
      let userInfo = await dispatch('toGetUser');
      return userInfo;
    };
    let userInfo = {};
    if (res.errcode == '0') {
      userInfo = await setUser(res.data.key, commit);
      Notification({
        title: '登录成功',
        // message: `欢迎,${user.user_name}`,
        type: 'success',
        duration: 2000,
      });
      return userInfo;
    } else {
      if (needReturn) return res;
      else {
        Notification({
          title: '登录失败',
          message: `失败原因:${res.errmsg || '登陆失败'}`,
          type: 'error',
        });
      }
    }
  },
  async toGetUser({ commit }, payload) {
    let key = localStorage.getItem('token');
    if (!key) {
      if (_.isFunction(payload)) {
        payload();
        return;
      }
      console.log('游客身份');
      let user = localStorage.getItem('user');
      if (user) {
        commit('setUser', JSON.parse(user), { root: true });
      } else {
        let stamp = new Date().getTime();
        let name = `游客${stamp}`;
        localStorage.setItem('user', JSON.stringify({ name }));
        commit('setUser', { name }, { root: true });
      }
      return;
    }
    console.log('用户');
    let res = await axios.post(api.getUser, { key: key });
    let user = {};
    if (res.data.errcode == '0') {
      let token = _.get(res, `data.data.token`);
      if (token) {
        user = jwt.decode(token);
        commit('setUser', user, { root: true });
      }
    }
    return user;
  },
  async toGetMenu({ commit }, payload) {
    const res = await this.$axios.$get(api.getMenu, payload);
    return res;
  },
  async logout({ commit }, payload) {
    let key = localStorage.removeItem('token');
    const res = await this.$axios.$post(api.logout, { key: key });
    commit('deleteUser');
  },
  async update({ commit }, payload) {
    let res = await this.$axios.$post(`${api.updatePassword}`, {
      data: payload,
    });
    return res;
  },
  async bind({ commit }, payload) {
    let res = await this.$axios.$post(`${api.bind}`, payload);
    return res;
  },
  async userBind({ commit }, payload) {
    let res = await this.$axios.$post(`${api.userBind}`, payload);
    return res;
  },
  async getQrcode({ commit }, payload) {
    let res = await this.$axios.$get(`${api.connection}`);
    if (res.errcode === 0) return res.data;
    else {
      console.warn('请求qrcode失败');
    }
  },
  async wxCheck({ commit }, payload) {
    let res = await this.$axios.$post(`${api.wxCheck}`, payload);
    return res;
  },
};
export default {
  namespaced: true,
  state,
  mutations,
  actions,
};
