import axios from 'axios'
import router from '@/router'
import url from '@/plugins/routes'

const state = {
  user: {
    username: null,
    firstname: null,
    lastname: null,
    accessToken: null,
    group: null
  },
  loggingIn: false,
  loginError: null
}

const mutations = {
  loginStart: state => (state.loggingIn = true),
  loginStop(state, errorMessage) {
    state.loggingIn = false
    state.loginError = errorMessage
  },
  updateAccessToken(state, data) {
    if (typeof data === typeof '') {
      data = JSON.parse(data)
    }
    if (data === null || data === undefined) {
      state.user.username = null
      state.user.accessToken = null
      state.user.group = null
    } else {
      state.user.username = data.username
      state.user.accessToken = data.accessToken
      state.user.group = data.group
      state.user.firstname = data.firstname
      state.user.lastname = data.lastname
    }
  },
  logout(state) {
    state.user.accessToken = null
    state.user.username = null
    state.user.group = null
    state.user.firstname = null
    state.user.lastname = null
  }
}

const actions = {
  async doLogin({ commit }, loginData) {
    commit('loginStart')
    try {
      const response = await axios.post(url.login, { ...loginData })
      console.log(response.data)
      localStorage.setItem(
        'user',
        JSON.stringify({
          username: response.data.username,
          accessToken: response.data.token,
          group: response.data.group,
          firstname: response.data.firstname,
          lastname: response.data.lastname
        })
      )
      commit('loginStop', null)
      commit('updateAccessToken', response.data)
      if (state.user.group.includes('moneymaster')) {
        router.push('/main/finanzer/overview')
      } else if (state.user.group.includes('bar')) {
        router.push('/main/bar/geruecht')
      } else if (state.user.group.includes('user')) {
        router.push('/main/user/add')
      }
    } catch (err) {
      commit('loginStop', err.response.data.error)
      commit('updateAccessToken', {
        username: null,
        accessToken: null,
        group: null,
        firstname: null,
        lastname: null
      })
    }
  },
  fetchAccessToken({ commit }) {
    commit('updateAccessToken', localStorage.getItem('user'))
  },
  logout({ commit }) {
    localStorage.removeItem('user')
    commit('logout')
    router.push('/login')
  },
  resetLoginError({ commit }) {
    commit('loginStop')
  }
}

const getters = {
  loggingIn: state => {
    return state.loggingIn
  },
  getGroup: state => {
    return state.user.group
  },
  group: state => {
    return state.user.group
  },
  getToken: state => {
    return state.user.accessToken
  },
  token: state => {
    return state.user.accessToken
  },
  loginError: state => {
    return state.loginError
  },
  isBar: state => {
    try {
      return state.user.group.includes('bar') ? true : false
    } catch (e) {
      return false
    }
  },
  isFinanzer: state => {
    try {
      return state.user.group.includes('moneymaster') ? true : false
    } catch (e) {
      return false
    }
  },
  isUser: state => {
    try {
      return state.user.group.includes('user') ? true : false
    } catch (e) {
      return false
    }
  },
  isLoggedIn: state => {
    return state.user.accessToken ? true : false
  },
  user: state => {
    return state.user
  }
}

export default {
  state,
  mutations,
  actions,
  getters
}