import Mock from 'mockjs'
// import table from './mockFiles/table'
// import demoTable from '@/app-demo/table/mock'
import mockFetch from './fetch-mockjs'
import appMocks from './loader'

const mocks = [
  // ...table,
  ...appMocks
]
// for front mock
// please use it cautiously, it will redefine XMLHttpRequest,
// which will cause many of your third-party libraries to be invalidated(like progress event).
export function mockXHR() {
  mockFetch(Mock)
  // mock patch
  // https://github.com/nuysoft/Mock/issues/300
  Mock.XHR.prototype.proxy_send = Mock.XHR.prototype.send
  Mock.XHR.prototype.send = function () {
    if (this.custom.xhr) {
      this.custom.xhr.withCredentials = this.withCredentials || false

      if (this.responseType) {
        this.custom.xhr.responseType = this.responseType
      }
    }
    this.proxy_send(...arguments)
  }
  function param2Obj(url) {
    const search = url.split('?')[1]
    if (!search) {
      return {}
    }
    return JSON.parse(
      '{"' +
      decodeURIComponent(search)
        .replace(/"/g, '\\"')
        .replace(/&/g, '","')
        .replace(/=/g, '":"')
        .replace(/\+/g, ' ') +
      '"}'
    )
  }
  function XHR2ExpressReqWrap(respond) {
    return function (options) {
      let result = null
      if (respond instanceof Function) {
        const { body='{}', method, url } = options
        // https://expressjs.com/en/4x/api.html#req
        try{
          result = respond({
            url,
            method,
            body: JSON.parse(body),
            query: param2Obj(url)
          })
        }catch(error){
          console.log(body, error)
        }
      } else {
        result = respond
      }
      return Mock.mock(result)
    }
  }

  for (const i of mocks) {
    Mock.mock(new RegExp(`${i.url}`), i.type || 'get', XHR2ExpressReqWrap(i.response))
  }
}

