Source: ZEventsApiTicketingTypes/ZEventsApiTicketingTypes.js

import ifPromise from 'onyx-common/ifPromise'

const ZEventsApiTicketingTypes = ({ prototype }) => {
  prototype.normalizeTicketingType = function (_data) {
    const data = this.normalizeData(_data)

    const ret = {
      id: data.id,
      name: data.name,
      capacity: data.capacity,
      price: data.price,
      description: data.description
    }

    return ret
  }

  prototype._createTicketingType = function ({ eventId, ...rest }) {
    const payload = {
      url: this.getUrl(`/api/v1/events/${eventId}/ticketing_types`),
      method: 'POST',
      requestType: 'json',
      data: rest
    }

    return this.authenticatedFetchWrap(payload)
  }

  /**
   * @typedef {object} TicketingType
   * @property {number} id - ticketing type id
   * @property {string} name - ticketing type name
   * @property {number} capacity - number of ticketing types available
   * @property {string} description - more details on ticketing type
   * @property {number} price - ticketing type price
   */

  /**
   * @function createTicketingType
   * @param {object} payload -  TicketingType payload
   * @param {number} payload.eventId - event id
   * @param {string} payload.name - name of ticketing type
   * @param {number} payload.capacity - number of ticketing type available
   * @param {number} payload.price - price of ticketing type
   * @param {string} payload.description - more detailed description of ticketing type
   * @returns {TicketingType} - TicketingType instance
   * @example
   *
   * createTicketingType({
   *   eventId: 10,
   *   name: 'VIP',
   *   capacity: 1000,
   *   price: 500,
   *   description: "Special backstage pass"
   * })
   */

  prototype.createTicketingType = function (payload) {
    const {
      eventId,
      name,
      capacity,
      price,
      description
    } = payload

    const finalPayload = {
      eventId,
      name,
      capacity,
      price,
      description
    }

    const raw = ifPromise(payload, () => this._createTicketingType(finalPayload))
    return raw
      .then(res => this.normalizeTicketingType(res.data))
      .catch(error => this.onError('createTicketingType', error))
  }

  prototype._deleteTicketingType = function ({ eventId, id }) {
    const payload = {
      url: this.getUrl(`/api/v1/events/${eventId}/ticketing_types/${id}`),
      method: 'DELETE',
      requestType: 'json'
    }

    return this.authenticatedFetchWrap(payload)
  }

  /**
   * @function deleteTicketingType
   * @param {object} payload - The event payload
   * @param {number} payload.eventId - event id
   * @param {number} payload.id - ticketing type id
   * @returns {void}
   * @example
   *
   * deleteEvent({
   *   eventId: 100,
   *   id: 3838
   * })
   */

  prototype.deleteTicketingType = function (payload) {
    const finalPayload = {
      eventId: payload.eventId,
      id: payload.id
    }

    const raw = ifPromise(payload, () => this._deleteTicketingType(finalPayload))
    return raw
      .catch(error => this.onError('deleteTicketingType', error))
  }

  prototype._getTicketingTypes = function ({ id, ...rest }) {
    const payload = {
      url: this.getUrl(`/api/v1/events/${id}/ticketing_types`),
      method: 'GET',
      requestType: 'json',
      data: rest
    }

    return this.fetchWrap(payload)
  }

  /**
   * @typedef {object} getTicketingTypesSummary
   * @property {number} page - page of results
   * @property {number} perPage - results per page
   * @property {boolean} hasMore - are more pages available?
   */

  /**
   * @typedef {object} getTicketingTypesReturn
   * @property {TicketingType[]} entries - list of ticketing types returned
   * @property {getTicketingTypesSummary} listSummary - list summary object
   * @property {object} criteriaSummary - criteria summary object (empty)
   */

  /**
   * @function getTicketingTypes
   * @param {object} payload - The payload
   * @param {number} payload.id - event id
   * @param {number} [payload.page=1] - result set page
   * @returns {getTicketingTypesReturn} - getTicketingTypesReturn
   * @example
   *
   * getTicketingTypes({
   *   id: 10,
   *   page: 2
   * })
   */

  prototype.getTicketingTypes = function (payload) {
    const finalPayload = {
      id: payload.id,
      page: payload?.page || 1
    }

    const raw = ifPromise(payload, () => this._getTicketingTypes(finalPayload))
    return raw
      .then(res => this.normalizeListData(res.data, this.normalizeTicketingType))
      .catch(error => this.onError('getTicketingTypes', error))
  }

  prototype._showTicketingType = function ({ eventId, id }) {
    const payload = {
      url: this.getUrl(`/api/v1/events/${eventId}/ticketing_types/${id}`),
      method: 'GET'
    }

    return this.authenticatedFetchWrap(payload)
  }

  /**
   * @function showTicketingType
   * @param {object} payload - TicketingType payload
   * @param {number} payload.eventId - event id
   * @param {number} payload.id - ticketing type id
   * @returns {TicketingType} - TicketingType instance
   * @example
   *
   * showTicketingType({
   *   eventId: 10,
   *   id: 100
   * })
   */

  prototype.showTicketingType = function (payload) {
    const finalPayload = {
      eventId: payload.eventId,
      id: payload.id
    }
    const raw = ifPromise(payload, () => this._showTicketingType(finalPayload))
    return raw
      .then(res => this.normalizeTicketingType(res.data))
      .catch(error => this.onError('showTicketingType', error))
  }

  prototype._updateTicketingType = function ({ eventId, id, ...rest }) {
    const payload = {
      url: this.getUrl(`/api/v1/events/${eventId}/ticketing_types/${id}`),
      method: 'PUT',
      requestType: 'json',
      data: rest
    }

    return this.authenticatedFetchWrap(payload)
  }

  /**
   * @function updateTicketingType
   * @param {object} payload -  TicketingType payload
   * @param {number} payload.eventId - event id
   * @param {number} payload.id - ticketing type id
   * @param {string} payload.name - name of ticketing type
   * @param {number} payload.capacity - number of ticketing type available
   * @param {number} payload.price - price of ticketing type
   * @param {string} payload.description - more detailed description of ticketing type
   * @returns {TicketingType} - TicketingType instance
   * @example
   *
   * updateTicketingType({
   *   eventId: 10,
   *   id: 100,
   *   name: 'VIP',
   *   capacity: 1000,
   *   price: 500,
   *   description: "Special backstage pass"
   * })
   */

  prototype.updateTicketingType = function (payload) {
    const finalPayload = {
      eventId: payload.eventId,
      id: payload.id,
      name: payload.name,
      description: payload.description,
      price: payload.price,
      capacity: payload.capacity
    }

    const raw = ifPromise(payload, () => this._updateTicketingType(finalPayload))
    return raw
      .then(res => this.normalizeTicketingType(res.data))
      .catch(error => this.onError('updateTicketingType', error))
  }
}

export default ZEventsApiTicketingTypes