export const buildViewEndpoints = API => ({
  /**
   * Fetches all rows in a view
   * @param name the name of the view
   * @param field the field to perform the calculation on
   * @param groupBy the field to group by
   * @param calculation the calculation to perform
   */
  fetchViewData: async ({ name, field, groupBy, calculation }) => {
    const params = new URLSearchParams()
    if (calculation) {
      params.set("field", field)
      params.set("calculation", calculation)
    }
    if (groupBy) {
      params.set("group", groupBy)
    }
    const QUERY_VIEW_URL = field
      ? `/api/views/${name}?${params}`
      : `/api/views/${name}`
    return await API.get({ url: QUERY_VIEW_URL })
  },

  /**
   * Exports a view for download
   * @param viewName the view to export
   * @param format the format to download
   */
  exportView: async ({ viewName, format }) => {
    const safeViewName = encodeURIComponent(viewName)
    return await API.get({
      url: `/api/views/export?view=${safeViewName}&format=${format}`,
      parseResponse: async response => {
        return await response.text()
      },
    })
  },

  /**
   * Saves a view.
   * @param view the view to save
   */
  saveView: async view => {
    return await API.post({
      url: "/api/views",
      body: view,
    })
  },

  /**
   * Deletes a view.
   * @param viewName the name of the view to delete
   */
  deleteView: async viewName => {
    return await API.delete({
      url: `/api/views/${viewName}`,
    })
  },
})
