/* eslint-disable camelcase */
import jwt_decode from 'jwt-decode'

export const state = () => ({
    jwtToken: '',
    isLogin: false
})

// mutate values in state
export const mutations = {
    UPDATE_TOKEN (state, obj) {
        state.jwtToken = obj.token
        this.$cookies.set('token', obj.token, {
            path: '/',
            maxAge: 60 * 60 * 24 * 365,
            sameSite: 'lax'
        })
    },
    UPDATE_IS_LOGIN (state, bool) {
        state.isLogin = bool
    },
    REMOVE_TOKEN (state) {
        this.$cookies.remove('token')
        state.jwtToken = null
    }
}

export const actions = {
    async obtainToken ({ commit, state }, { username, password }) {
        const payload = {
            username,
            password
        }
        let code = null
        await this.$axios.post('auth/login/', payload)
            .then((response) => {
                commit('UPDATE_TOKEN', { token: response.data.user.token })
                commit('UPDATE_IS_LOGIN', true)
                code = response.status
            })
            .catch((error) => {
                code = error.response.status
            })

        return code
    },

    inspectToken ({ commit, dispatch, state }) {
        const token = this.$cookies.get('token')

        if (token) {
            commit('UPDATE_TOKEN', { token })
            const decoded_token = jwt_decode(token)
            const timestamp = Date.now() / 1000
            const expire_token = decoded_token.exp

            if (state.jwtToken && expire_token - timestamp > 15) {
                commit('UPDATE_IS_LOGIN', true)
            } else {
                // PROMPT USER TO RE-LOGIN, THIS ELSE CLAUSE COVERS THE CONDITION WHERE A TOKEN IS EXPIRED AS WELL
                commit('UPDATE_IS_LOGIN', false)
            }
        } else {
            commit('UPDATE_IS_LOGIN', false)
        }
    }
}