import uc from "@/api/uc.js";
import portal from "@/api/portal.js";
import store from '@/store/login';

const state = {
    currentUser: null,
    loginAccount: null,
    isRefreshToken: false,
    isJump: false,
}

const getters = {}

const actions = {
    actionLoginAccount({ commit, state }, loginAccount) {
        commit("mutationLoginAccount", loginAccount)
    },
    // 登录获取字典
    getAllDict({ commit, state }) {
        portal.getSysDict().then(res => {
            if (res) {
                sessionStorage.setItem('dict_data', JSON.stringify(res))
            }
        })
    },
    //企业微信登录
    loginByQYWX({ commit, state }, code) {
        return new Promise((resolve, reject) => {
            uc.authQYWX(code).then(user => {
                if (user) {
                    sessionStorage.setItem("currentUser", JSON.stringify(user))
                    commit("setCurrentUser", user)
                    resolve(user.loginStatus)
                } else {
                    reject()
                }
            }).catch(err => {
                console.log(err, "err")
                commit("clearCurrentUser")
                reject(err)
            })
        })
    },
    // 愉快政code登录
    loginByReports({ commit, state }, code) {
        return new Promise((resolve, reject) => {
            // 设置跳转类型，在返回401无权限时不跳转到登录页
            uc.authEmployeeCodeLogin(code).then(user => {
                if (user.state === undefined && user.loginStatus) {
                    sessionStorage.setItem("currentUser", JSON.stringify(user))
                    commit("setCurrentUser", user)
                    resolve(user)
                } else {
                    reject(user)
                }
            }).catch(err => {
                console.log(err, "err")
                commit("clearCurrentUser")
                reject(err)
            })
        })
    },
    // 愉快政绑定
    bindingYKZ({ commit, state }, data) {
        return new Promise((resolve, reject) => {
            // 设置跳转类型，在返回401无权限时不跳转到登录页
            commit("setJumpType", true)
            sessionStorage.setItem('isJUmp', JSON.stringify(true))
            uc.bindingYKZLogin(data).then(user => {
                if (user.loginStatus && user.loginStatus) {
                    sessionStorage.setItem("currentUser", JSON.stringify(user))
                    commit("setCurrentUser", user)
                    resolve(user)
                }
            }).catch(err => {
                commit("clearCurrentUser")
                reject(err)
            })
        })
    },
    loginByPrincipal({ commit, state }, principal) {
        return new Promise((resolve, reject) => {
            uc.authentication(principal, user => {
                if (user) {
                    sessionStorage.setItem("currentUser", JSON.stringify(user))
                    commit("setCurrentUser", user)
                    resolve(user.loginStatus)
                }
            }, (msg) => {
                commit("clearCurrentUser")
                reject(msg)
            })
        })
    },
    loginAuthNoPassword({ commit, state }, principal) {
        return new Promise((resolve, reject) => {
            uc.authNoPassword(principal, user => {
                if (user) {
                    sessionStorage.setItem("currentUser", JSON.stringify(user))
                    commit("setCurrentUser", user)
                    resolve(user.loginStatus)
                }
            }, (msg) => {
                commit("clearCurrentUser")
                reject(msg)
            })
        })
    },
    validAndCompletedCurrent({ commit, state }, token) {
        return new Promise((resolve, reject) => {
            if (state.currentUser && !token) {
                resolve();
            }
            else {
                const user = sessionStorage.getItem("currentUser")
                if (user != "null" && user != undefined && user != "" && !token) {
                    commit("setCurrentUser", JSON.parse(user))
                    resolve()
                }
                else if (token) {
                    uc.basicSso(token, user => {
                        sessionStorage.setItem("currentUser", JSON.stringify(user));
                        commit("setCurrentUser", user);
                        resolve();
                    }, () => {
                        reject();
                    });
                }
                else {
                    reject()
                }
            }
        })
    },
    refreshAndGetAuthenticationToken({ commit, state }) {
        if (state.isRefreshToken) {
            return;
        }
        commit("isRefreshToken", true);
        return new Promise((resolve, reject) => {
            uc.refreshAndGetAuthenticationToken().then(user => {

                if (user) {
                    sessionStorage.setItem("currentUser", JSON.stringify(state.currentUser));
                    commit("refreshToken", user.token)
                    setTimeout(() => {
                        commit("isRefreshToken", false);
                    }, 3000)
                    resolve()
                }
            }, (msg) => {
                reject(msg)
            })
        })
    },
    logoutAndCleanUp({ commit, state }) {
        return new Promise((resolve, reject) => {
            uc.logout().finally(() => {
                sessionStorage.removeItem('currentRoleMenus')
                sessionStorage.removeItem('currentRoleCode')
                sessionStorage.removeItem("currentUserDetail")
                sessionStorage.removeItem("currentUser")
                sessionStorage.removeItem("searchDate")
                commit("clearCurrentUser");
                commit("user/setCurrentUserDetail", null, { root: true });
                commit("user/setCurrentUserOrg", null, { root: true });
                resolve();
            });
        })
    }
}

const mutations = {
    isRefreshToken(state, status) {
        state.isRefreshToken = status;
    },
    refreshToken(state, token) {
        state.currentUser.token = token;
        state.currentUser.loginTime = new Date().getTime();
    },
    setCurrentUser(state, current) {
        state.currentUser = current
    },
    clearCurrentUser(state) {
        state.currentUser = null
    },
    mutationLoginAccount(state, loginAccount) {
        state.loginAccount = loginAccount;
    },
    setJumpType(state, type) {
        state.isJump = type;
    }
}

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