const path = require('path')
const apiMocker = require('mocker-api')
const mockerDelay = require('mocker-api/lib/delay')
const glob = require('glob')

function getBeforeHook(app) {
  const files = glob.sync('./src/_mock/*/*.js').map((file) => path.resolve(file))
  apiMocker(app, files)
  app.get('/', function(req, res) {
    res.send(
      '<p>如果您是新打开的页面，请<a href="/-app-/">点击此处</a>跳转到Dev Server</p><p>如果您是从其他页面跳转过来的，那么跳转地址就是错误的</p>'
    )
  })
}

/**
 * 模拟数据的配置
 * @typedef {Object} MockConfig
 * @property {string} [method="get"] http方法：get/post/patch/delete，默认get
 * @property {string} url 请求的地址，可以通过 :myvar 捕获变量
 * @property {Object} data 返回的数据，传递function可以读取变量、控制输出
 * @property {number} [delay] 返回数据前的等待时间，默认500(ms)
 */

/**
 * @param {MockConfig|MockConfig[]} mocks - 模拟数据的配置
 */
function create(mocks) {
  // 把定义数据转换成 mocker-api 格式，并处理虚拟路径
  mocks = Array.isArray(mocks) ? mocks : [mocks]
  const _ret = {}
  let _delay
  mocks.forEach(({ method = 'get', data, url, delay = '500' } = {}) => {
    _delay = delay
    const key = `${method.toUpperCase()} /-app-/${url}`
    _ret[key] = data
  })
  return mockerDelay(_ret, _delay)
}

module.exports = {
  getBeforeHook,
  create,
}
