Source: ZEventsApiUserPreferences/ZEventsApiUserPreferences.js

import ifPromise from 'onyx-common/ifPromise'
import hasKey from 'onyx-common/hasKey'

const ZEventsApiUserPreferences = ({ prototype }) => {
  prototype.normalizeUserPreferences = function (_data) {
    const data = this.normalizeData(_data)

    const mapProps = {
      registered_event_start: 'registeredEventStart',
      registered_event_1_hour_before: 'registeredEvent1HourBefore',
      registered_event_24_hours_before: 'registeredEvent24HoursBefore',
      registered_event_is_live: 'registeredEventIsLive'
    }

    const interim = this.filterAndMapProps(data, mapProps)
    const finalRet = {}
    for (const prop in interim) {
      finalRet[prop] = !!interim[prop]
    }

    return finalRet
  }

  prototype._createUserPreferences = function ({ id, ...rest }) {
    const payload = {
      url: this.getUrl(`/api/v1/users/${id}/user_preferences`),
      method: 'POST',
      requestType: 'json',
      data: rest
    }

    return this.authenticatedFetchWrap(payload)
  }

  /**
   * @function createUserPreferences
   * @param {object} payload - the payload -- should include 1 or more preferences
   * @param {string} [payload.id='me'] - user id to assign preferences
   * @param {boolean} [payload.registeredEventStart] - notify user when event starts?
   * @param {boolean} [payload.registeredEvent1HourBefore] - notify user 1 hour before event starts?
   * @param {boolean} [payload.registeredEvent24HoursBefore] - notify 24 hours before?
   * @param {boolean} [payload.registeredEventIsLive] - notify right when event goes live?
   * @returns {UserPreferences} - UserPreferences object
   * @example
   *
   * createUserPreferences({
   *   registeredEventStart: true
   * })
   */
  prototype.createUserPreferences = function (payload) {
    const finalPayload = {
      id: this.normalizeUserId(payload.id)
    }

    if (hasKey(payload, 'registeredEventStart')) finalPayload.registered_event_start = !!payload.registeredEventStart
    if (hasKey(payload, 'registeredEvent1HourBefore')) finalPayload.registered_event_1_hour_before = !!payload.registeredEvent1HourBefore
    if (hasKey(payload, 'registeredEvent24HoursBefore')) finalPayload.registered_event_24_hours_before = !!payload.registeredEvent24HoursBefore
    if (hasKey(payload, 'registeredEventIsLive')) finalPayload.registered_event_is_live = !!payload.registeredEventIsLive
    // if (hasKey(payload, 'kwivrrMarketing')) finalPayload.kwivrrMarketing = !!payload.kwivrrMarketing

    const raw = ifPromise(payload, () => this._createUserPreferences(finalPayload))
    return raw
      .then(res => this.normalizeUserPreferences(res.data))
      .catch(error => this.onError('createUserPreference', error))
  }

  prototype._getUserPreferences = function ({ id }) {
    const payload = {
      url: this.getUrl(`/api/v1/users/${id}/user_preferences`),
      method: 'GET'
    }

    return this.authenticatedFetchWrap(payload)
  }

  /**
   * @typedef {object} UserPreferences
   * @property {boolean} registeredEventStart - notify user when event starts?
   * @property {boolean} registeredEvent1HourBefore - notify user 1 hour before event starts?
   * @property {boolean} registeredEvent24HoursBefore - notify 24 hours before?
   * @property {boolean} registeredEventIsLive - notify right when event goes live?
   */

  /**
   * @function getUserPreferences
   * @param {object} [payload] - the payload
   * @param {string} [payload.id='me'] - user id to assign preferences
   * @returns {UserPreferences} - UserPreferences object
   * @example
   *
   * getUserPreferences()
   */

  prototype.getUserPreferences = function (payload = {}) {
    const finalPayload = {
      id: this.normalizeUserId(payload?.userId)
    }
    const raw = ifPromise(payload, () => this._getUserPreferences(finalPayload))
    return raw
      .then(res => this.normalizeUserPreferences(res.data))
      .catch(error => this.onError('getUserPreferences', error))
  }
}

export default ZEventsApiUserPreferences