config.js

/**
 * @module Config
 */

import './types.js'

/** @type {Config} */
export let globalConfig = {
  sanityConfig: {},
  railcontentConfig: {},
  sessionConfig: {},
  localStorage: null,
  isMA: false,
  localTimezoneString: null, // In format: America/Vancouver
  permissionsVersion: 'v2', // 'v1' or 'v2'
}

/**
 * Exported functions that are excluded from index generation.
 *
 * @type {string[]}
 */
const excludeFromGeneratedIndex = []

/**
 * Initializes the service with the given configuration.
 * This function must be called before using any other functions in this library.
 * Automatically initializes award definitions with 24-hour cache in the background.
 *
 * @param {Config} config - Configuration object containing API settings.
 *
 * @example Web Application
 * initializeService({
 *   sanityConfig: {
 *     token: 'your-sanity-api-token',
 *     projectId: 'your-sanity-project-id',
 *     dataset: 'your-dataset-name',
 *     version: '2021-06-07',
 *     debug: true,
 *     useCachedAPI: false,
 *   },
 *   railcontentConfig: {
 *     token: 'your-user-api-token',
 *     userId: 'current-user-id',
 *     baseUrl: 'https://web-staging-one.musora.com',
 *     authToken: 'your-auth-token',
 *   },
 *   sessionConfig: {
 *     token: 'your-user-api-token',
 *     userId: 'current-user-id',
 *     authToken: 'your-auth-token',
 *   },
 *   baseUrl: 'https://web-staging-one.musora.com',
 *   localStorage: localStorage,
 *   isMA: false,
 *   permissionsVersion: 'v1', // Optional: 'v1' (default) or 'v2'
 *   appEnv: 'local'
 * });
 *
 * @example React Native Application
 * import AsyncStorage from '@react-native-async-storage/async-storage'
 *
 * initializeService({
 *   sanityConfig: { ... },
 *   railcontentConfig: { ... },
 *   sessionConfig: { ... },
 *   baseUrl: 'https://web-staging-one.musora.com',
 *   localStorage: AsyncStorage,
 *   isMA: true,
 *   localTimezoneString: '',
 *   permissionsVersion: 'v2',
 *   appEnv: 'local'
 * });
 */
export function initializeService(config) {
  globalConfig.sanityConfig = config.sanityConfig
  globalConfig.railcontentConfig = config.railcontentConfig
  globalConfig.sessionConfig = config.sessionConfig || config.railcontentConfig
  globalConfig.baseUrl = config.baseUrl || config.railcontentConfig.baseUrl
  globalConfig.localStorage = config.localStorage
  globalConfig.isMA = config.isMA || false
  globalConfig.localTimezoneString = config.localTimezoneString || null
  globalConfig.permissionsVersion = config.permissionsVersion || 'v2'

  if (config.localStorage) {
    import('./awards/internal/award-definitions')
      .then(({ awardDefinitions }) => awardDefinitions.initialize())
      .catch(error => {
        console.error('Failed to initialize award definitions:', error)
      })
  }
}

export function initializeEnvVar(config) {
  globalConfig.appEnv = config.appEnv
}