/**
 * A mixin that can be used to copy and paste row values.
 */

import { setRichClipboard } from '@baserow/modules/database/utils/clipboard'

export default {
  methods: {
    copySelectionToClipboard(fields, rows) {
      const textData = []
      const jsonData = []
      for (const row of rows) {
        const text = fields.map((field) =>
          this.$registry
            .get('field', field.type)
            .prepareValueForCopy(field, row['field_' + field.id])
        )
        const json = fields.map((field) =>
          this.$registry
            .get('field', field.type)
            .prepareRichValueForCopy(field, row['field_' + field.id])
        )
        textData.push(text)
        jsonData.push(json)
      }
      const tsv = this.$papa.unparse(textData, {
        delimiter: '\t',
      })
      const values = {
        'text/plain': tsv,
        'application/json': JSON.stringify(jsonData),
      }
      setRichClipboard(values)
    },
    async extractClipboardData(event) {
      const textRawData = event.clipboardData.getData('text/plain').trim()

      let jsonRawData
      if (event.clipboardData.types.includes('application/json')) {
        jsonRawData = event.clipboardData.getData('application/json')
      }

      const { data: textData } = await this.$papa.parsePromise(textRawData, {
        delimiter: '\t',
      })

      let jsonData = null
      if (jsonRawData) {
        try {
          const parsed = JSON.parse(jsonRawData)
          // Check if we have an array of arrays with At least one row with at least
          // one row with a value Otherwise the paste is empty
          if (
            Array.isArray(parsed) &&
            parsed.length === textData.length &&
            parsed.every((row) => Array.isArray(row)) &&
            parsed.some((row, index) => row.length > 0)
          ) {
            jsonData = JSON.parse(jsonRawData)
          }
        } catch (e) {}
      }

      return [textData, jsonData]
    },
  },
}