// Libraries
import React, { PureComponent } from 'react';
import _ from 'lodash';

// Components
import ResetStyles from 'app/core/components/Picker/ResetStyles';
import PickerOption from 'app/core/components/Picker/PickerOption';
import IndicatorsContainer from 'app/core/components/Picker/IndicatorsContainer';
import Select from 'react-select';

// Types
import { DataSourceSelectItem } from 'app/types';

export interface Props {
  onChangeDataSource: (ds: DataSourceSelectItem) => void;
  datasources: DataSourceSelectItem[];
  current: DataSourceSelectItem;
}

export class DataSourcePicker extends PureComponent<Props> {
  searchInput: HTMLElement;

  constructor(props) {
    super(props);
  }

  onChange = item => {
    const ds = this.props.datasources.find(ds => ds.name === item.value);
    this.props.onChangeDataSource(ds);
  };

  render() {
    const { datasources, current, onChangeDatasource } = this.props;

    const options = datasources.map(ds => ({
      value: ds.name,
      label: ds.name,
      avatarUrl: ds.meta.info.logos.small,
    }));

    const value = { label: current.name, label: current.name };

    return (
      <div className="gf-form-inline">
        <Select
          classNamePrefix={`gf-form-select-box`}
          isMulti={false}
          menuShouldScrollIntoView={false}
          isClearable={false}
          className="gf-form-input gf-form-input--form-dropdown ds-picker"
          onChange={item => this.onChange(item)}
          options={options}
          styles={ResetStyles}
          maxMenuHeight={500}
          placeholder="Select datasource"
          loadingMessage={() => 'Loading datasources...'}
          noOptionsMessage={() => 'No datasources found'}
          value={value}
          components={{
            Option: PickerOption,
            IndicatorsContainer,
          }}
        />
      </div>
    );
  }
}

export default DataSourcePicker;
