/* eslint react/no-multi-comp:0, no-console:0 */

import { createForm } from '../index'
import { regionStyle, errorStyle } from './styles'
import BaseMixin from '../../_util/BaseMixin'

const Email = {
  props: {
    form: Object,
  },
  methods: {
    checkSpecial (rule, value, callback) {
      setTimeout(() => {
        if (value === 'yiminghe@gmail.com') {
          callback('can not be!')
        } else {
          callback()
        }
      }, 1000)
    },
  },

  render () {
    const { getFieldProps, getFieldError, isFieldValidating } = this.form
    const errors = getFieldError('email')
    return (<div style={ regionStyle }>
      <div>email validate onBlur</div>
      <div>
        <input {...getFieldProps('email', {
          initialValue: '',
          validateFirst: true,
          rules: [
            {
              required: true,
            },
            {
              type: 'email',
              message: '错误的 email 格式',
            },
            this.checkSpecial,
          ],
          validateTrigger: 'blur',
        })}
        /></div>
      <div style={errorStyle}>
        {errors ? errors.join(',') : null}
      </div>
      <div style={errorStyle}>
        {isFieldValidating('email') ? 'validating' : null}
      </div>
    </div>)
  },
}

const Form = {
  mixins: [BaseMixin],
  props: {
    form: Object,
  },
  data () {
    return {
      loading: true,
    }
  },

  mounted () {
    setTimeout(() => {
      this.setState({
        loading: false,
      }, () => {
        setTimeout(() => {
          this.form.setFieldsInitialValue({
            email: 'xx@gmail.com',
          })
        }, 1000)
      })
    }, 1000)
  },
  methods: {
    onSubmit (e) {
      e.preventDefault()
      this.form.submit((callback) => {
        setTimeout(() => {
          this.form.validateFields((error, values) => {
            if (!error) {
              console.log('ok', values)
            } else {
              console.log('error', error, values)
            }
            callback()
          })
        }, 1000)
      })
    },

    reset (e) {
      e.preventDefault()
      this.form.resetFields()
    },
  },

  render () {
    if (this.loading) {
      return <b>loading</b>
    }
    const { form } = this
    const disabled = form.isFieldsValidating() || form.isSubmitting()
    return (<div style={{ margin: 20 }}>
      <h2>async init field</h2>
      <form onSubmit={this.onSubmit}>
        <Email form={ form }/>

        <div style={ regionStyle }>
          <button disabled={disabled} type='submit'>submit</button>
          &nbsp;{disabled ? <span style={{ color: 'red' }}>disabled</span> : null}&nbsp;
          <button disabled={disabled} onClick={this.reset}>reset</button>
        </div>
      </form>
    </div>)
  },
}

export default createForm()(Form)
