import { requireConfigValue } from '../../isomorphic-config'
import Cookies from 'js-cookie'
import type { IOAuthToken } from '@spree/storefront-api-v2-sdk/types/interfaces/Token'
import UserTokenResponseParseError from '../../errors/UserTokenResponseParseError'

export const getUserTokenResponse = (): IOAuthToken | undefined => {
  const stringifiedToken = Cookies.get(
    requireConfigValue('userCookieName') as string
  )

  if (!stringifiedToken) {
    return undefined
  }

  try {
    const token: IOAuthToken = JSON.parse(stringifiedToken)

    return token
  } catch (parseError) {
    throw new UserTokenResponseParseError(
      'Could not parse stored user token response.'
    )
  }
}

/**
 * Retrieves the saved user token response. If the response fails json parsing,
 * removes the saved token and returns @type {undefined} instead.
 */
export const ensureUserTokenResponse = (): IOAuthToken | undefined => {
  try {
    return getUserTokenResponse()
  } catch (error) {
    if (error instanceof UserTokenResponseParseError) {
      removeUserTokenResponse()

      return undefined
    }

    throw error
  }
}

export const setUserTokenResponse = (token: IOAuthToken) => {
  const cookieOptions = {
    expires: requireConfigValue('userCookieExpire') as number,
  }

  Cookies.set(
    requireConfigValue('userCookieName') as string,
    JSON.stringify(token),
    cookieOptions
  )
}

export const removeUserTokenResponse = () => {
  Cookies.remove(requireConfigValue('userCookieName') as string)
}