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

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

const CustomInput = {
  props: {
    form: Object,
  },
  data () {
    return {
      data: [],
    }
  },
  methods: {
    checkUpper (rule, value = '', callback) {
      if (value !== value.toUpperCase()) {
        callback(new Error('need to be upper!'))
      } else {
        callback()
      }
    },
    toUpper (v, prev) {
      if (v === prev) {
        return v
      }
      return v.toUpperCase()
    },
  },

  render () {
    const { getFieldProps, getFieldError } = this.form
    const errors = getFieldError('upper')
    return (<div style={ regionStyle }>
      <div>upper normalize</div>
      <div>
        <input {...getFieldProps('upper', {
          normalize: this.toUpper,
          rules: [{
            validator: this.checkUpper,
          }],
        })}
        />
      </div>
      <div style={errorStyle}>
        {(errors) ? errors.join(',') : null}
      </div>
    </div>)
  },
}

const MaxMin = {
  props: {
    form: Object,
  },
  methods: {
    normalizeMin (value, prevValue, allValues) {
      console.log('normalizeMin', allValues.min, allValues.max)
      const previousAllValues = this.form.getFieldsValue()
      if (allValues.max !== previousAllValues.max) {
        // max changed
        if (value === '' || Number(allValues.max) < Number(value)) {
          return allValues.max
        }
      }
      return value
    },
    normalizeMax (value, prevValue, allValues) {
      console.log('normalizeMax', allValues.min, allValues.max)
      const previousAllValues = this.form.getFieldsValue()
      if (allValues.min !== previousAllValues.min) {
        // min changed
        if (value === '' || Number(allValues.min) > Number(value)) {
          return allValues.min
        }
      }
      return value
    },
  },

  render () {
    const { getFieldProps } = this.form
    return (<div style={ regionStyle }>
      <div>min: <select
        {...getFieldProps('min', {
          normalize: this.normalizeMin,
          initialValue: '',
        })}
      >
        <option value=''>empty</option>
        <option value='1'>1</option>
        <option value='2'>2</option>
        <option value='3'>3</option>
        <option value='4'>4</option>
        <option value='5'>5</option>
      </select>
      </div>
      <div>max: <select
        {...getFieldProps('max', {
          initialValue: '',
          normalize: this.normalizeMax,
        })}
      >
        <option value=''>empty</option>
        <option value='1'>1</option>
        <option value='2'>2</option>
        <option value='3'>3</option>
        <option value='4'>4</option>
        <option value='5'>5</option>
      </select>
      </div>
    </div>)
  },
}

const Form = {
  // props: {
  //   form: Object,
  // },
  methods: {
    onSubmit (e) {
      e.preventDefault()
      this.form.validateFields((error, values) => {
        if (!error) {
          console.log('ok', values)
        } else {
          console.log('error', error, values)
        }
      })
    },
  },

  render () {
    const { form } = this
    return (<div style={{ margin: '20px' }}>
      <h2>normalize</h2>
      <form onSubmit={this.onSubmit}>
        <CustomInput form={ form }/>

        <MaxMin form={ form }/>

        <div style={ regionStyle }>
          <button>submit</button>
        </div>
      </form>
    </div>)
  },
}

export default createForm()(Form)