import * as Context from './context'
import * as Utils from './internal/utils'

// octokit + plugins
import {Octokit} from '@octokit/core'
import {OctokitOptions} from '@octokit/core/dist-types/types'
import {restEndpointMethods} from '@octokit/plugin-rest-endpoint-methods'
import {paginateRest} from '@octokit/plugin-paginate-rest'

export const context = new Context.Context()

const baseUrl = Utils.getApiBaseUrl()
export const defaults: OctokitOptions = {
  baseUrl,
  request: {
    agent: Utils.getProxyAgent(baseUrl),
    fetch: Utils.getProxyFetch(baseUrl)
  }
}

export const GitHub = Octokit.plugin(
  restEndpointMethods,
  paginateRest
).defaults(defaults)

/**
 * Convience function to correctly format Octokit Options to pass into the constructor.
 *
 * @param     token    the repo PAT or GITHUB_TOKEN
 * @param     options  other options to set
 */
export function getOctokitOptions(
  token: string,
  options?: OctokitOptions
): OctokitOptions {
  const opts = Object.assign({}, options || {}) // Shallow clone - don't mutate the object provided by the caller

  // Auth
  const auth = Utils.getAuthString(token, opts)
  if (auth) {
    opts.auth = auth
  }

  return opts
}
