import _mergeJSXProps from 'babel-helper-vue-jsx-merge-props';
/* eslint react/no-multi-comp:0, no-console:0 */

import createDOMForm from '../src/createDOMForm';
import { DatePicker, Select } from 'ant-design-vue';
import { regionStyle, errorStyle } from './styles';
var Option = Select.Option;


var Email = {
  props: {
    form: Object
  },
  render: function render() {
    var h = arguments[0];
    var _form = this.form,
        getFieldProps = _form.getFieldProps,
        getFieldError = _form.getFieldError,
        isFieldValidating = _form.isFieldValidating;

    var errors = getFieldError('email');
    return h(
      'div',
      { style: regionStyle },
      [h('div', ['email sync validate']), h('div', [h('input', getFieldProps('email', {
        initialValue: '',
        rules: [{ type: 'email', message: h(
            'b',
            { key: 'err' },
            ['\u9519\u8BEF\u7684 email \u683C\u5F0F']
          ) }]
      }))]), h(
        'div',
        { style: errorStyle },
        [errors]
      ), h(
        'div',
        { style: errorStyle },
        [isFieldValidating('email') ? 'validating' : null]
      )]
    );
  }
};

var User = {
  props: {
    form: Object
  },
  methods: {
    userExists: function userExists(rule, value, callback) {
      setTimeout(function () {
        if (value === '1') {
          callback([new Error('are you kidding?')]);
        } else if (value === 'yiminghe') {
          callback([new Error('forbid yiminghe')]);
        } else {
          callback();
        }
      }, 300);
    }
  },

  render: function render() {
    var h = arguments[0];
    var _form2 = this.form,
        getFieldProps = _form2.getFieldProps,
        getFieldError = _form2.getFieldError,
        isFieldValidating = _form2.isFieldValidating;

    var errors = getFieldError('user');
    return h(
      'div',
      { style: regionStyle },
      [h('div', [h(
        'span',
        {
          style: {
            color: 'red'
          }
        },
        ['*']
      ), 'user async validate']), h('div', [h('input', getFieldProps('user', {
        initialValue: '',
        validateFirst: true,
        rules: [{ required: true }, { validator: this.userExists }]
      }))]), h(
        'div',
        { style: errorStyle },
        [errors ? errors.join(',') : null]
      ), h(
        'div',
        { style: errorStyle },
        [isFieldValidating('user') ? 'validating' : null]
      )]
    );
  }
};

var CustomInput = {
  props: {
    form: Object
  },
  render: function render() {
    var h = arguments[0];
    var _form3 = this.form,
        getFieldProps = _form3.getFieldProps,
        getFieldError = _form3.getFieldError,
        isFieldValidating = _form3.isFieldValidating;

    var errors = getFieldError('select');
    return h(
      'div',
      { style: regionStyle },
      [h('div', [h(
        'span',
        {
          style: {
            color: 'red'
          }
        },
        ['*']
      ), 'custom select sync validate']), h('div', [h(
        Select,
        _mergeJSXProps([{
          attrs: {
            placeholder: 'please select'
          },
          style: {
            width: '200px'
          }
        }, getFieldProps('select', { rules: [{ required: true }] })]),
        [h(
          Option,
          {
            attrs: { value: '1' }
          },
          ['1']
        ), h(
          Option,
          {
            attrs: { value: '2' }
          },
          ['2']
        )]
      )]), h(
        'div',
        { style: errorStyle },
        [errors ? errors.join(',') : null]
      ), h(
        'div',
        { style: errorStyle },
        [isFieldValidating('select') ? 'validating' : null]
      )]
    );
  }
};

var DateInput = {
  props: {
    form: Object
  },
  render: function render() {
    var h = arguments[0];
    var _form4 = this.form,
        getFieldProps = _form4.getFieldProps,
        getFieldError = _form4.getFieldError;

    var errors = getFieldError('date');
    return h(
      'div',
      { style: regionStyle },
      [h('div', [h(
        'span',
        {
          style: {
            color: 'red'
          }
        },
        ['*']
      ), 'DateInput sync validate']), h(
        'div',
        {
          style: {
            width: '200px'
          }
        },
        [h(DatePicker, _mergeJSXProps([{
          attrs: {
            placeholder: 'please select'
          }
        }, getFieldProps('date', { rules: [{ required: true, type: 'object' }] })]))]
      ), h(
        'div',
        { style: errorStyle },
        [errors ? errors.join(',') : null]
      )]
    );
  }
};

function toNumber(v) {
  if (v === undefined) {
    return v;
  }
  if (v === '') {
    return undefined;
  }
  if (v && v.trim() === '') {
    return NaN;
  }
  return Number(v);
}

var NumberInput = {
  props: {
    form: Object
  },
  render: function render() {
    var h = arguments[0];
    var _form5 = this.form,
        getFieldProps = _form5.getFieldProps,
        getFieldError = _form5.getFieldError;

    var errors = getFieldError('number');
    return h(
      'div',
      { style: regionStyle },
      [h('div', ['number input']), h('div', [h('input', getFieldProps('number', {
        initialValue: '1',
        rules: [{ transform: toNumber, type: 'number' }]
      }))]), h(
        'div',
        { style: errorStyle },
        [errors ? errors.join(',') : null]
      )]
    );
  }
};

var Form = {
  methods: {
    onSubmit: function onSubmit(e) {
      console.log('submit');
      e.preventDefault();
      this.form.validateFieldsAndScroll({
        scroll: {
          offsetTop: 20
        }
      }, function (error, values) {
        if (!error) {
          console.log('ok', values);
        } else {
          console.log('error', error, values);
        }
      });
    },
    reset: function reset(e) {
      e.preventDefault();
      this.form.resetFields();
    }
  },

  render: function render() {
    var h = arguments[0];
    var form = this.form;
    var getFieldProps = form.getFieldProps,
        getFieldError = form.getFieldError;

    return h(
      'div',
      {
        style: {
          margin: '20px'
        }
      },
      [h('h2', ['overview']), h(
        'form',
        {
          on: {
            'submit': this.onSubmit
          }
        },
        [h(User, {
          attrs: { form: form, saveRef: this.saveRef }
        }), h(NumberInput, {
          attrs: { form: form }
        }), h(Email, {
          attrs: { form: form }
        }), h(CustomInput, {
          attrs: { form: form }
        }), h(DateInput, {
          attrs: { form: form }
        }), h(
          'div',
          { style: regionStyle },
          [h('div', ['normal required input']), h('div', [h('input', getFieldProps('normal', { initialValue: '', rules: [{ required: true }] }))]), h(
            'div',
            { style: errorStyle },
            [getFieldError('normal') ? getFieldError('normal').join(',') : null]
          )]
        ), h(
          'div',
          { style: regionStyle },
          [h(
            'button',
            {
              on: {
                'click': this.reset
              }
            },
            ['reset']
          ), '\xA0', h('input', {
            attrs: { type: 'submit', value: 'submit' }
          })]
        )]
      )]
    );
  }
};

export default createDOMForm({
  validateMessages: {
    required: function required(field) {
      return field + ' \u5FC5\u586B';
    }
  }
})(Form);