import { API } from "api"
import { writable } from "svelte/store"

const createAuthStore = () => {
  const store = writable(null)

  // Fetches the user object if someone is logged in and has reloaded the page
  const fetchUser = async () => {
    let globalSelf = null
    let appSelf = null

    // First try and get the global user, to see if we are logged in at all
    try {
      globalSelf = await API.fetchBuilderSelf()
    } catch (error) {
      store.set(null)
      return
    }

    // Then try and get the user for this app to provide via context
    try {
      appSelf = await API.fetchSelf()
    } catch (error) {
      // Swallow
    }

    // Use the app self if present, otherwise fallback to the global self
    store.set(appSelf || globalSelf || null)
  }

  const logOut = async () => {
    try {
      await API.logOut()
    } catch (error) {
      // Do nothing
    }

    // Manually destroy cookie to be sure
    window.document.cookie = `budibase:auth=; budibase:currentapp=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;`
  }

  return {
    subscribe: store.subscribe,
    actions: { fetchUser, logOut },
  }
}

export const authStore = createAuthStore()
