import { login, logout, getInfo,getPublicKey  } from "@/api/login";
import { getToken, setToken, removeToken } from "@/utils/auth";
import { encrypt, decrypt } from '@/utils/jsencrypt'
import { delFavorites } from '@/api/system/favorites'
const user = {
  state: {
    token: getToken(),
    id: "",
    name: "",
    avatar: "",
    dept: [],
    roles: [],
    permissions: [],
    favoriteRouter: [],
  },

  mutations: {
    SET_TOKEN: (state, token) => {
      state.token = token;
    },
    SET_ID: (state, id) => {
      state.id = id;
    },
    SET_NAME: (state, name) => {
      state.name = name;
    },
    SET_NICK_NAME: (state, nickName) => {
      state.nickName = nickName;
    },
    SET_AVATAR: (state, avatar) => {
      state.avatar = avatar;
    },
    SET_ROLES: (state, roles) => {
      state.roles = roles;
    },
    SET_PERMISSIONS: (state, permissions) => {
      state.permissions = permissions;
    },
    SET_DEPT: (state, dept) => {
      state.dept = dept;
    },
    SET_FAVORITE_ROUTER: (state, favoriteRouter) => {
      state.favoriteRouter = favoriteRouter;
    },
    REMOVE_ROUTE(state, id) {
      state.favoriteRouter = state.favoriteRouter.filter((favorite) => favorite.id !== id);

    },
  },

  actions: {
    DELETE_ROUTE({ commit }, routeId) {
      return new Promise((resolve, reject) => {
        delFavorites(routeId) .then(res => {
          commit('REMOVE_ROUTE', routeId);
        })
        .catch(error => {
          reject(error)
        })
       

      });
    },
    getPublicKey() {
      return new Promise((resolve, reject) => {
        getPublicKey()
          .then(res => {
            resolve(res)
          })
          .catch(error => {
            reject(error)
          })
      })
    },
    // 登录
    Login({ commit, dispatch }, userInfo) {
      return new Promise((resolve, reject) => {
        dispatch('getPublicKey').then(res => {
          let publicKey = res.publicKey
          const username = userInfo.username.trim()
          //调用加密方法(传密码和公钥)
          const password = encrypt(userInfo.password, publicKey)
          const code = userInfo.code
          const uuid = userInfo.uuid
          login(username, password, code, uuid)
            .then(res => {
              setToken(res.token)
              commit('SET_TOKEN', res.token)
              resolve()
            })
            .catch(error => {
              reject(error)
            })
        })
      })
    },
    // Login({ commit, dispatch  }, userInfo) {
    //   const username = userInfo.username.trim();
    //   const password = userInfo.password;
    //   const code = userInfo.code;
    //   const uuid = userInfo.uuid;
    //   return new Promise((resolve, reject) => {
    //     login(username, password, code, uuid)
    //       .then((res) => {
    //         setToken(res.token);
    //         commit("SET_TOKEN", res.token);
    //         resolve();
    //       })
    //       .catch((error) => {
    //         reject(error);
    //       });
    //   });
    // },

    // 获取用户信息
    GetInfo({ commit, state }) {
      return new Promise((resolve, reject) => {
        getInfo()
          .then((res) => {
            const user = res.user;
            const dept = res.deptList;
            const avatar =
              user.avatar == "" || user.avatar == null
                ? require("@/assets/images/profile.jpg")
                : process.env.VUE_APP_BASE_API + user.avatar;
            if (res.roles && res.roles.length > 0) {
              // 验证返回的roles是否是一个非空数组
              commit("SET_ROLES", res.roles);
              commit("SET_PERMISSIONS", res.permissions);
            } else {
              commit("SET_ROLES", ["ROLE_DEFAULT"]);
            }
            commit("SET_ID", user.userId);
            commit("SET_NAME", user.userName);
            commit("SET_NICK_NAME", user.nickName);
            commit("SET_AVATAR", avatar);
            commit("SET_DEPT", dept);
            commit("SET_FAVORITE_ROUTER", res.favoriteRouter);
            resolve(res);
          })
          .catch((error) => {
            reject(error);
          });
      });
    },

    // 退出系统
    LogOut({ commit, state }) {
      return new Promise((resolve, reject) => {
        logout(state.token)
          .then(() => {
            commit("SET_TOKEN", "");
            commit("SET_ROLES", []);
            commit("SET_PERMISSIONS", []);
            removeToken();
            resolve();
          })
          .catch((error) => {
            reject(error);
          });
      });
    },

    // 前端 登出
    FedLogOut({ commit }) {
      return new Promise((resolve) => {
        commit("SET_TOKEN", "");
        removeToken();
        resolve();
      });
    },
  },
};

export default user;
