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,
    dictData: []
}

const getters = {}

const actions = {
    getDict({
        commit,
        state
    }) {
        return new Promise((resolve, reject) => {
            portal.getSysDict().then(data => {
                if (data) {
                    sessionStorage.setItem('dict_data', JSON.stringify(data))
                    commit("setDictData", data)
                    resolve()
                }
            })
        })
    },
    actionLoginAccount({
        commit,
        state
    }, loginAccount) {
        commit("mutationLoginAccount", loginAccount)
    },
    dingJump({
        commit,
        state
    }, user) {
        commit("setCurrentUser", user);
    },
    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)
            })
        })
    },
    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("currentUser")
                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;
    },
    setDictData(state, dictData) {
        state.dictData = dictData;
    }
}

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