import {defineStore} from 'pinia'
import axios from 'axios'

export const useAuthStore = defineStore('auth', {
  state: () => {
    return {
      token: null,
      admin_token: null,
      user: null,
    }
  },
  getters: {
    check: (state) => (state.user !== null && state.user !== undefined),
    isImpersonating: (state) => (state.admin_token !== null && state.admin_token !== undefined)
  },
  actions: {
    // Stores admin token temporarily for impersonation
    startImpersonating() {
      this.setAdminToken(this.token)
    },
    // Stop admin impersonation
    stopImpersonating() {
      this.token = this.admin_token
      this.admin_token = null
        // TODO: re-fetch user
    },

    setToken(token) {
      this.setCookie('token', token)
      this.token = token
    },

    setAdminToken(token) {
      this.setCookie('admin_token', token)
      this.admin_token = token
    },

    setCookie(name, value) {
      if (process.client) {
        useCookie(name).value = value
      }
    },

    initStore(token, adminToken) {
      this.token = token
      this.admin_token = adminToken
    },

    setUser(user) {
      if (!user) {
        console.error('Error.setting.user')
        this.setToken(null)
      }

      this.user = user
      this.initServiceClients()
    },

    updateUser(payload) {
      this.user = payload
      this.initServiceClients()
    },

    initServiceClients() {
      if (!this.user) return
      useAmplitude().setUser(this.user)
      useCrisp().setUser(this.user)

      // Init sentry
      // console.log(process)
      // $sentry.configureScope((scope) => {
      //   scope.setUser({
      //     id: this.user.id,
      //     email: this.user.email,
      //     subscription: this.user?.is_subscribed
      //   })
      // })
    },

    async logout() {
      try {
        await useOpnApi('logout', {method: 'POST'})
      } catch (e) {
      }

      this.user = null
      this.setToken(null)
    },

    async fetchOauthUrl(provider) {
      const {data} = await axios.post(`/api/oauth/${provider}`)
      return data.url
    }
  }
})
