export const buildRowEndpoints = API => ({
  /**
   * Fetches data about a certain row in a table.
   * @param tableId the ID of the table to fetch from
   * @param rowId the ID of the row to fetch
   */
  fetchRow: async ({ tableId, rowId }) => {
    if (!tableId || !rowId) {
      return null
    }
    const row = await API.get({
      url: `/api/${tableId}/rows/${rowId}`,
    })
    return (await API.enrichRows([row], tableId))[0]
  },

  /**
   * Creates or updates a row in a table.
   * @param row the row to save
   */
  saveRow: async row => {
    if (!row?.tableId) {
      return
    }
    return await API.post({
      url: `/api/${row.tableId}/rows`,
      body: row,
    })
  },

  /**
   * Deletes a row from a table.
   * @param tableId the ID of the table to delete from
   * @param rowId the ID of the row to delete
   * @param revId the rev of the row to delete
   */
  deleteRow: async ({ tableId, rowId, revId }) => {
    if (!tableId || !rowId) {
      return
    }
    return await API.delete({
      url: `/api/${tableId}/rows`,
      body: {
        _id: rowId,
        _rev: revId,
      },
    })
  },

  /**
   * Deletes multiple rows from a table.
   * @param tableId the table ID to delete the rows from
   * @param rows the array of rows to delete
   */
  deleteRows: async ({ tableId, rows }) => {
    return await API.delete({
      url: `/api/${tableId}/rows`,
      body: {
        rows,
      },
    })
  },

  /**
   * Exports rows.
   * @param tableId the table ID to export the rows from
   * @param rows the array of rows to export
   * @param format the format to export (csv or json)
   * @param columns which columns to export (all if undefined)
   */
  exportRows: async ({ tableId, rows, format, columns }) => {
    return await API.post({
      url: `/api/${tableId}/rows/exportRows?format=${format}`,
      body: {
        rows,
        columns,
      },
      parseResponse: async response => {
        return await response.text()
      },
    })
  },
})
