import React, { PropTypes } from 'react';
import TextField from './TextField';
import CheckboxField from './CheckboxField';
import TextAreaField from './TextAreaField';
import SelectField from './SelectField';
import { fieldTypes } from '../stores/store';

const propTypes = {
  name: PropTypes.string.isRequired,
  type: PropTypes.oneOf(fieldTypes).isRequired,
  label: PropTypes.string.isRequired,
  choices: PropTypes.arrayOf(PropTypes.array),
  description: PropTypes.string,
  places: PropTypes.number,
  validators: PropTypes.any,
  onChange: React.PropTypes.func,
  value: PropTypes.oneOfType([PropTypes.string, PropTypes.bool, PropTypes.array]).isRequired,
};

const defaultProps = {
  choices: null,
  description: null,
  places: null,
  validators: null,
  onChange: () => {},
};

export default class FieldSet extends React.Component {
  renderCheckBoxField() {
    return (
      <CheckboxField
        {...this.props}
      />);
  }

  renderTextAreaField() {
    return (
      <TextAreaField
        {...this.props}
      />);
  }

  renderSelectField(selectProps) {
    return (
      <SelectField
        {...this.props}
        {...selectProps}
      />);
  }

  renderTextField() {
    return (
      <TextField
        {...this.props}
      />);
  }

  render() {
    const type = this.props.type;
    const selectProps = {
      SelectCustomMultiField: { multi: true, freeForm: true },
      SelectMultipleSortableField: { multi: true, freeForm: false },
      SelectField: { multi: false, freeForm: false },
      FreeFormSelectField: { multi: false, freeForm: true },
    };
    let field;

    if (type === 'CheckboxField') {
      field = this.renderCheckBoxField();
    } else if (Object.keys(selectProps).includes(type)) {
      field = this.renderSelectField(selectProps[type]);
    } else if (['TextField', 'IntegerField'].includes(type)) {
      field = this.renderTextField();
    } else if (type === 'TextAreaField') {
      field = this.renderTextAreaField();
    }

    return field;
  }
}

FieldSet.propTypes = propTypes;
FieldSet.defaultProps = defaultProps;
