module.exports = authenticationPlugin;

const { Deprecation } = require("deprecation");
const once = require("once");

const deprecateAuthenticate = once((log, deprecation) => log.warn(deprecation));

const authenticate = require("./authenticate");
const beforeRequest = require("./before-request");
const requestError = require("./request-error");

function authenticationPlugin(octokit, options) {
  if (options.auth) {
    octokit.authenticate = () => {
      deprecateAuthenticate(
        octokit.log,
        new Deprecation(
          '[@octokit/rest] octokit.authenticate() is deprecated and has no effect when "auth" option is set on Octokit constructor'
        )
      );
    };
    return;
  }
  const state = {
    octokit,
    auth: false
  };
  octokit.authenticate = authenticate.bind(null, state);
  octokit.hook.before("request", beforeRequest.bind(null, state));
  octokit.hook.error("request", requestError.bind(null, state));
}