import { GigyaSdkDataCenters, GigyaSdkLinkAccountVersions, GigyaSdkStateType } from '../types'

import getState from '../core/getState'

export const initialState: GigyaSdkStateType = {
  UID: '',
  lang: 'en',
  apiKey: '',
  storageKey: 'GigyaSdkState',
  dataCenter: GigyaSdkDataCenters.EU1,
  linkAccountVersion: GigyaSdkLinkAccountVersions.V1,
}

export let state: GigyaSdkStateType = initialState

export function setState(data: Partial<GigyaSdkStateType>): Promise<GigyaSdkStateType> {
  return new Promise(async (resolve, reject) => {
    try {
      const oldState = await getState()
      const newState = { ...oldState, ...data }
      const setItem = data.storage?.setItem || oldState.storage?.setItem

      await Promise.resolve(setItem?.(newState.storageKey, JSON.stringify(newState)))

      state = newState

      resolve(state)
    } catch (e) {
      reject(e)
    }
  })
}
