<template>
  <div
    class="filters__condition-item"
    :class="{ 'filters__condition-item--loading': filter._?.loading }"
  >
    <div class="filters__field">
      <Dropdown
        :value="filter.field"
        :disabled="disableFilter"
        :fixed-items="true"
        class="dropdown--tiny"
        @input="$emit('updateFilter', { field: $event })"
      >
        <DropdownItem
          v-for="field in fields"
          :key="'field-' + field.id"
          :name="field.name"
          :value="field.id"
          :disabled="!hasCompatibleFilterTypes(field, filterTypes)"
        ></DropdownItem>
      </Dropdown>
    </div>
    <div class="filters__type">
      <Dropdown
        :disabled="disableFilter"
        :value="filter.type"
        :fixed-items="true"
        class="dropdown--tiny"
        @input="$emit('updateFilter', { type: $event })"
      >
        <DropdownItem
          v-for="fType in allowedFilters(filterTypes, fields, filter.field)"
          :key="fType.type"
          :name="fType.getName()"
          :value="fType.type"
        ></DropdownItem>
      </Dropdown>
    </div>
    <div class="filters__value">
      <component
        :is="getInputComponent(filter.type, filter.field)"
        v-if="
          fieldIdExists(fields, filter.field) &&
          fieldIsCompatible(filter.type, filter.field)
        "
        ref="filter-value"
        :filter="filter"
        :view="view"
        :fields="fields"
        :disabled="disableFilter"
        :read-only="readOnly"
        @input="$emit('updateFilter', { value: $event })"
      />
      <i
        v-else-if="!fieldIdExists(fields, filter.field)"
        v-tooltip="$t('viewFilterContext.relatedFieldNotFound')"
        class="fas fa-exclamation-triangle color-error"
      ></i>
      <i
        v-else-if="!fieldIsCompatible(filter.type, filter.field)"
        v-tooltip="$t('viewFilterContext.filterTypeNotFound')"
        class="fas fa-exclamation-triangle color-error"
      ></i>
    </div>
    <a
      class="filters__remove"
      :class="{ 'filters__remove--disabled': disableFilter }"
      @click="!disableFilter && $emit('deleteFilter', $event)"
    >
      <i class="iconoir-bin"></i>
    </a>
  </div>
</template>

<script>
import { hasCompatibleFilterTypes } from '@baserow/modules/database/utils/field'

export default {
  name: 'ViewFieldConditionItem',
  props: {
    filter: {
      type: Object,
      required: true,
    },
    fields: {
      type: Array,
      required: true,
    },
    view: {
      type: Object,
      required: true,
    },
    disableFilter: {
      type: Boolean,
      default: false,
    },
    readOnly: {
      type: Boolean,
      required: true,
    },
  },
  computed: {
    filterTypes() {
      return this.$registry.getAll('viewFilter')
    },
  },
  methods: {
    hasCompatibleFilterTypes,
    focusValue() {
      if (this.$refs['filter-value']?.focus !== undefined) {
        this.$refs['filter-value'].focus()
      }
    },
    allowedFilters(filterTypes, fields, fieldId) {
      const field = fields.find((f) => f.id === fieldId)
      return Object.values(filterTypes).filter((filterType) => {
        return field !== undefined && filterType.fieldIsCompatible(field)
      })
    },
    getInputComponent(type, fieldId) {
      const field = this.fields.find(({ id }) => id === fieldId)
      return this.$registry.get('viewFilter', type).getInputComponent(field)
    },
    fieldIdExists(fields, fieldId) {
      return fields.findIndex((field) => field.id === fieldId) !== -1
    },
    fieldIsCompatible(filterType, fieldId) {
      const field = this.fields.find(({ id }) => id === fieldId)
      return this.$registry
        .get('viewFilter', filterType)
        .fieldIsCompatible(field)
    },
  },
}
</script>