<template>
  <v-menu
    :value="opened"
    :position-x="x"
    :position-y="y"
    absolute
    offset-y
    @input="close"
  >
    <v-list
      dense
      min-width="150"
      max-height="400"
      class="overflow-y-auto"
    >
      <v-list-item>
        <v-autocomplete
          ref="autocomplete"
          v-model="value"
          :items="labels"
          autofocus
          dense
          deletable-chips
          hide-details
          item-text="text"
          item-value="id"
          label="Select a label"
          small-chips
          @input="onLabelSelected"
        />
      </v-list-item>
      <v-list-item
        v-for="(label, i) in labels"
        :key="i"
        @click="onLabelSelected(label.id)"
      >
        <v-list-item-action
          v-if="hasAnySuffixKey"
        >
          <v-chip
            v-if="label.suffixKey"
            :color="label.backgroundColor"
            outlined
            small
            v-text="label.suffixKey"
          />
          <span v-else class="mr-8" />
        </v-list-item-action>
        <v-list-item-content>
          <v-list-item-title v-text="label.text"/>
        </v-list-item-content>
      </v-list-item>
    </v-list>
  </v-menu>
</template>

<script lang="ts">
import Vue from 'vue'
export default Vue.extend({
  props: {
    labels: {
      type: Array,
      default: () => [],
      required: true,
    },
    opened: {
      type: Boolean,
      default: false,
      required: true,
    },
    selectedLabel: {
      type: Object,
      default: null,
      required: false,
    },
    x: {
      type: Number,
      default: 0,
      required: true,
    },
    y: {
      type: Number,
      default: 0,
      required: true,
    }
  },

  data() {
    return {
      startOffset: 0,
      endOffset: 0,
      entity: null as any,
      fromEntity: null as any,
      toEntity: null as any,
      value: this.selectedLabel
    };
  },

  computed: {
    hasAnySuffixKey(): boolean {
      return this.labels.some((label: any) => label.suffixKey !== null)
    }
  },

  methods: {
    close() {
      // Todo: a bit hacky. I want to fix this problem.
      // https://github.com/vuetifyjs/vuetify/issues/10765
      this.$nextTick(() => {
        this.value = null
        if (this.$refs.autocomplete) {
          (this.$refs.autocomplete as any).selectedItems = []
        }
      })
      this.$emit('close')
    },

    onLabelSelected(labelId: number) {
      this.value = labelId
      this.$emit('click:label', labelId)
      this.close()
    }
  }
})
</script>
