const Octokit = require('@octokit/rest')
const HttpError = require('@octokit/request/lib/http-error')
const throttlingPlugin = require('../..')

module.exports = Octokit
  .plugin((octokit) => {
    octokit.__t0 = Date.now()
    octokit.__requestLog = []
    octokit.__requestTimings = []

    octokit.hook.wrap('request', async (request, options) => {
      octokit.__requestLog.push(`START ${options.method} ${options.url}`)
      octokit.__requestTimings.push(Date.now() - octokit.__t0)
      await new Promise(resolve => setTimeout(resolve, 0))

      const res = options.request.responses.shift()
      if (res.status >= 400) {
        const message = res.data.message != null ? res.data.message : `Test failed request (${res.status})`
        const error = new HttpError(message, res.status, res.headers, options)
        throw error
      } else {
        octokit.__requestLog.push(`END ${options.method} ${options.url}`)
        octokit.__requestTimings.push(Date.now() - octokit.__t0)
        return res
      }
    })
  })
  .plugin(throttlingPlugin)