import { IS_ARRAY_STRING_REG, deconstruct } from './shared'

/**
 * 钩子方法，可触发对应钩子
 */
function Hooks() {
  this.hooks = []
}

/**
 * 绑定钩子
 * @param {String} type 钩子名称
 * @param {Function} action 执行钩子触发的方法
 */
Hooks.prototype.bind = function(type, action) {
  this.hooks[type] = action
}

/**
 * 触发之前绑定的钩子
 * @param {String} type 钩子类型
 */
Hooks.prototype.tap = function(type, params) {
  this.hooks[type] && this.hooks[type](params)
}

// hook实例
const HooksIntance = new Hooks()

export const BEFORE_REQUEST = 'beforeRequest'

/**
 * 绑定接口请求前触发的事件
 * @param formData 当前表单触发的数据
 */
HooksIntance.bind(BEFORE_REQUEST, formData => {
  // 校验当前接口请求数据中是否有需要解构的内容
  Object.keys(formData).forEach(key => {
    // 将key去掉空格
    const noSpaceKey = key.replace(' ', '')
    // 如果当前是数组字符串
    if (IS_ARRAY_STRING_REG.test(noSpaceKey)) {
      // 当前值
      const formItemValue = formData[key] ? (
        formData[key] instanceof Array ? formData[key] : `${formData[key] || ''}`.split(',')
      ) : []
      // 将解构的数据放入数组中
      deconstruct(noSpaceKey).forEach((mapKey, mapIndex) => {
        formData[mapKey] = formItemValue[mapIndex]
      })
      // 删除原来的数据
      delete formData[key]
    }
  })
})

export default HooksIntance
