import { getUndoRedoActionRequestConfig } from '@baserow/modules/database/utils/action'
import addPublicAuthTokenHeader from '@baserow/modules/database/utils/publicView'

export default (client) => {
  return {
    fetchAll(
      tableId,
      includeFilters = false,
      includeSortings = false,
      includeGroupBys = false,
      includeDecorations = false,
      limit = null,
      type = null
    ) {
      const config = {
        params: {},
      }
      const include = []

      if (includeFilters) {
        include.push('filters')
      }

      if (includeSortings) {
        include.push('sortings')
      }

      if (includeGroupBys) {
        include.push('group_bys')
      }

      if (includeDecorations) {
        include.push('decorations')
      }

      if (include.length > 0) {
        config.params.include = include.join(',')
      }

      if (limit !== null) {
        config.params.limit = limit
      }

      if (type !== null) {
        config.params.type = type
      }

      return client.get(`/database/views/table/${tableId}/`, config)
    },
    create(tableId, values) {
      return client.post(`/database/views/table/${tableId}/`, {
        name: values.name,
        ownership_type: values.ownershipType,
        type: values.type,
      })
    },
    get(
      viewId,
      includeFilters = false,
      includeSortings = false,
      includeDecorations = false,
      includeGroupBys = false
    ) {
      const config = {
        params: {},
      }
      const include = []
      if (includeFilters) {
        include.push('filters')
      }

      if (includeSortings) {
        include.push('sortings')
      }

      if (includeDecorations) {
        include.push('decorations')
      }

      if (includeGroupBys) {
        include.push('group_bys')
      }

      if (include.length > 0) {
        config.params.include = include.join(',')
      }
      return client.get(`/database/views/${viewId}/`, config)
    },
    update(viewId, values) {
      return client.patch(`/database/views/${viewId}/`, values)
    },
    duplicate(viewId) {
      return client.post(`/database/views/${viewId}/duplicate/`)
    },
    order(tableId, ownershipType, order) {
      return client.post(`/database/views/table/${tableId}/order/`, {
        view_ids: order,
        ownership_type: ownershipType,
      })
    },
    delete(viewId) {
      return client.delete(`/database/views/${viewId}/`)
    },
    fetchFieldOptions(viewId) {
      return client.get(`/database/views/${viewId}/field-options/`)
    },
    updateFieldOptions({ viewId, values, undoRedoActionGroupId = null }) {
      const config = getUndoRedoActionRequestConfig({ undoRedoActionGroupId })
      return client.patch(
        `/database/views/${viewId}/field-options/`,
        values,
        config
      )
    },
    rotateSlug(viewId) {
      return client.post(`/database/views/${viewId}/rotate-slug/`)
    },
    linkRowFieldLookup(
      slug,
      fieldId,
      page,
      search = null,
      size = 100,
      publicAuthToken = null
    ) {
      const config = {
        params: {
          page,
          size,
        },
      }

      if (search !== null) {
        config.params.search = search
      }

      if (publicAuthToken) {
        addPublicAuthTokenHeader(config, publicAuthToken)
      }

      return client.get(
        `/database/views/${slug}/link-row-field-lookup/${fieldId}/`,
        config
      )
    },
    fetchPublicViewInfo(viewSlug, publicAuthToken = null) {
      const config = {}
      if (publicAuthToken) {
        addPublicAuthTokenHeader(config, publicAuthToken)
      }
      return client.get(`/database/views/${viewSlug}/public/info/`, config)
    },
  }
}