<template>
  <div class="row-history-entry">
    <div class="row-history-entry__header">
      <span class="row_history-entry__initials">{{ initials }}</span>
      <span class="row-history-entry__name">{{ name }}</span>
      <span class="row-history-entry__timestamp" :title="timestampTooltip">{{
        formattedTimestamp
      }}</span>
    </div>
    <div class="row-history-entry__content">
      <template v-for="fieldIdentifier in entryFields">
        <template
          v-if="
            getFieldName(fieldIdentifier) && getEntryComponent(fieldIdentifier)
          "
        >
          <div :key="fieldIdentifier" class="row-history-entry__field">
            {{ getFieldName(fieldIdentifier) }}
          </div>
          <component
            :is="getEntryComponent(fieldIdentifier)"
            :key="fieldIdentifier + 'content'"
            :entry="entry"
            :field-identifier="fieldIdentifier"
            :field="getField(fieldIdentifier)"
          ></component>
        </template>
      </template>
    </div>
  </div>
</template>

<script>
import moment from '@baserow/modules/core/moment'
import collaboratorName from '@baserow/modules/database/mixins/collaboratorName'

export default {
  name: 'RowHistoryEntry',
  mixins: [collaboratorName],
  props: {
    entry: {
      type: Object,
      required: true,
    },
    fields: {
      type: Array,
      required: true,
    },
  },
  computed: {
    name() {
      if (this.entry.user.id === this.$store.getters['auth/getUserObject'].id) {
        return this.$t('rowHistorySidebar.you')
      }
      return this.getCollaboratorName(this.entry.user, this.store)
    },
    initials() {
      return this.name.slice(0, 1).toUpperCase()
    },
    timestampTooltip() {
      return this.getLocalizedMoment(this.entry.timestamp).format('L LT')
    },
    formattedTimestamp() {
      return this.getLocalizedMoment(this.entry.timestamp).format('LT')
    },
    entryFields() {
      return new Set(
        Object.keys(this.entry.before).concat(Object.keys(this.entry.after))
      )
    },
  },
  methods: {
    getLocalizedMoment(timestamp) {
      return moment.utc(timestamp).tz(moment.tz.guess())
    },
    getFieldName(fieldIdentifier) {
      const field = this.getField(fieldIdentifier)
      if (field) {
        return field.name
      }
      return null
    },
    getField(fieldIdentifier) {
      const id = this.entry.fields_metadata[fieldIdentifier].id
      const field = this.fields.find((f) => f.id === id)
      return field
    },
    getEntryComponent(fieldIdentifier) {
      const type = this.entry.fields_metadata[fieldIdentifier].type
      const fieldType = this.$registry.get('field', type)
      if (fieldType) {
        return fieldType.getRowHistoryEntryComponent()
      }
      return null
    },
  },
}
</script>