let depends = null
/**
 * 收集单条规则的依赖校验
 * @param {String} key 
 * @param {Array | Object} rule 
 * [{ type: 'string', required: true, message: '请输入编码' }, { min: 6, max: 8, message: '编码长度不得小于6、大于8' }]
 */
export function collectDepends(key, rule) {
  if (!Array.isArray(rule)) {
    rule = [rule]
  }
  rule.forEach((item, index) => {
    if (item.dependValidator) {
      depends = depends || {}
      depends[key] = depends[key] || []
      depends[key].push(item.dependValidator)
    }
  })
  return depends
}

/**
 * 
 * @param {*} depends 收集的依赖对象
 * @param {Object} result async-validator的校验结果（报错的部分）
 * @param {*} formData 表单总数据
 * {
 *    code: {state: 'error', message: '编码不能重复'}
 * }
 * @return 返回一个长度为2的数组，第一个为boolean值，代表是否验证通过。第二个是错误消息状态，错误消息状态如下
 * {
 *    code: {state: 'error', message: '编码不能重复'}
 *    name: {state: 'success', message: ''}
 * }
 */
export function validateDepends(result, fields, formData) {
  return async function () {
    if (!depends) {
      return result
    }
    for (let key in depends) {
      if (result[key] && result[key].state === 'error') {
        // 该字段已校验失败的话，就不再校验
        continue
      }
      let depend = depends[key]
      if (!Array.isArray(depend)) {
        depend = [depend]
      }
      for (let validateFunc of depend) {
        let res = null
        await validateFunc(formData, fields[key], function(msg, dependKey) {
          dependKey = dependKey || key
          if (!msg) {
            // 若校验通过，则需消除依赖字段的校验状态
            res = { [dependKey]: { state: 'success', message: '' } }
          } else {
            res = { [dependKey]: { state: 'error', message: msg } }
          }
        })
        if (res) {
          // 按rules的顺序校验，只要出错就返回，一个字段永远只显示一条校验错误
          result = { ...res, ...result }
          break;
        }
      }
    }
    depends = null
    return result
  }()
}

