module.exports = authenticationBeforeRequest

const btoa = require('btoa-lite')
const uniq = require('lodash.uniq')

function authenticationBeforeRequest (state, options) {
  if (!state.auth.type) {
    return
  }

  if (state.auth.type === 'basic') {
    const hash = btoa(`${state.auth.username}:${state.auth.password}`)
    options.headers['authorization'] = `Basic ${hash}`
    return
  }

  if (state.auth.type === 'token') {
    options.headers['authorization'] = `token ${state.auth.token}`
    return
  }

  if (state.auth.type === 'app') {
    options.headers['authorization'] = `Bearer ${state.auth.token}`
    const acceptHeaders = options.headers['accept'].split(',')
      .concat('application/vnd.github.machine-man-preview+json')
    options.headers['accept'] = uniq(acceptHeaders).filter(Boolean).join(',')
    return
  }

  options.url += options.url.indexOf('?') === -1 ? '?' : '&'

  if (state.auth.token) {
    options.url += `access_token=${encodeURIComponent(state.auth.token)}`
    return
  }

  const key = encodeURIComponent(state.auth.key)
  const secret = encodeURIComponent(state.auth.secret)
  options.url += `client_id=${key}&client_secret=${secret}`
}