import { VPopover } from 'v-tooltip'

const SelectorInput = {
  name: 'SelectorInput',
  props: {
    name: String,
    value: String,
    label: String,
    description: String,
    selected: Boolean,
    handleChange: Function,
    handleEnter: Function,
    handleEsc: Function,
  },

  computed: {
    id: function() {
      return `${this.name}_${this.value}`
    },
  },

  methods: {
    onChange: function(e) {
      this.handleChange(this.value)
    },

    onEnter: function(e) {
      this.handleEnter()
    },

    onEsc: function(e) {
      this.handleEsc()
    },
  },
}

export default {
  name: 'selector',

  components: {
    VPopover,
    SelectorInput,
  },

  props: {
    choices: Array,
    defaultLabel: String,
    initialErrors: Array,
    initialChoice: {
      type: String,
      default: null,
    },
  },

  data: function() {
    return {
      value: this.initialChoice || null,
      currentChoice: this.initialChoice || null,
      showError: (this.initialErrors && this.initialErrors.length) || false,
      usingKeyboard: false,
    }
  },

  computed: {
    label: function() {
      if (this.value) {
        const selectedChoice = this.choices.find(choice => {
          return this.value === choice[0]
        })[1]
        return selectedChoice.name
      } else {
        return this.defaultLabel
      }
    },
  },

  methods: {
    change: function(value) {
      this.value = value
      this.showError = false
    },

    onShow: function() {
      setTimeout(() => {
        // timeout is a hack to make focus work in Chrome
        const selected = this.$refs.choices.find(choice => choice.selected)
        if (selected) {
          selected.$refs.input[0].focus()
        } else {
          this.$refs.choices[0].$refs.input[0].focus()
        }
      }, 100)
    },

    enter: function() {
      this.$refs.popover.hide()
    },

    esc: function() {
      this.value = this.currentChoice
      this.usingKeyboard = false
      this.$refs.popover.hide()
    },

    handleEnterOption: function(e) {
      this.change(e.target.value)
      this.currentChoice = e.target.value
      this.usingKeyboard = false
      this.$refs.popover.hide()
    },

    handleButtonArrowDown: function(e) {
      this.usingKeyboard = true
      this.$refs.popover.show()
    },
  },
}
