<script>
import { Option, OptGroup } from './vc-select'
import clonedeep from 'lodash.clonedeep'
import Select, { AbstractSelectProps, SelectValue } from '../select'
import Input from '../input'
import InputElement from './InputElement'
import PropTypes from '../_util/vue-types'
import { getComponentFromProp, getOptionProps, filterEmpty } from '../_util/props-util'

const DataSourceItemObject = PropTypes.shape({
  value: String,
  text: String,
}).loose
const DataSourceItemType = PropTypes.oneOfType([
  PropTypes.string,
  DataSourceItemObject,
]).isRequired

// export interface AutoCompleteInputProps {
//   onChange?: React.FormEventHandler<any>;
//   value: any;
// }

const AutoCompleteProps = {
  ...AbstractSelectProps,
  value: SelectValue,
  defaultValue: SelectValue,
  dataSource: DataSourceItemType,
  optionLabelProp: String,
  // onChange?: (value: SelectValue) => void;
  // onSelect?: (value: SelectValue, option: Object) => any;
}

export default {
  props: {
    ...AutoCompleteProps,
    prefixCls: PropTypes.string.def('ant-select'),
    showSearch: PropTypes.bool.def(false),
    transitionName: PropTypes.string.def('slide-up'),
    choiceTransitionName: PropTypes.string.def('zoom'),
    optionLabelProp: PropTypes.string.def('children'),
    filterOption: clonedeep(AbstractSelectProps.filterOption).def(false),
  },
  Option,
  OptGroup,
  methods: {
    getInputElement () {
      const { $slots } = this
      const children = filterEmpty($slots.default)
      const element = children.length ? children : <Input />
      console.log(element)
      // const elementProps = { ...element.props }
      return (
        <InputElement>{element}</InputElement>
      )
    },

    focus () {
      this.$nextTick(() => {
        if (this.$refs.select) {
          this.$refs.select.focus()
        }
      })
    },

    blur () {
      this.$nextTick(() => {
        if (this.$refs.select) {
          this.$refs.select.blur()
        }
      })
    },
  },

  render () {
    const {
      size, prefixCls, optionLabelProp, dataSource, $slots, $listeners,
    } = this

    const cls = {
      [`${prefixCls}-lg`]: size === 'large',
      [`${prefixCls}-sm`]: size === 'small',
      [`${prefixCls}-show-search`]: true,
      [`${prefixCls}-auto-complete`]: true,
    }

    let options
    const childArray = filterEmpty($slots.dataSource)
    if (childArray.length) {
      options = childArray
    } else {
      options = dataSource ? dataSource.map((item) => {
        switch (typeof item) {
          case 'string':
            return <Option key={item}>{item}</Option>
          case 'object':
            return (
              <Option key={item.value}>
                {item.text}
              </Option>
            )
          default:
            throw new Error('AutoComplete[dataSource] only supports type `string[] | Object[]`.')
        }
      }) : []
    }
    return (
      <Select
        {...getOptionProps(this)}
        class={cls}
        mode='combobox'
        optionLabelProp={optionLabelProp}
        getInputElement={this.getInputElement}
        notFoundContent={getComponentFromProp(this, 'notFoundContent')}
        ref='select'
        on={$listeners}
      >
        {options}
      </Select>
    )
  },
}

</script>