var crypto = require("crypto")
var HttpAgent = require("http").Agent
var HttpsAgent = require("https").Agent

var pkg = require("../package.json")

var httpAgent
var httpsAgent

module.exports = initialize

function initialize (uri, method, accept, headers) {
  if (!this.config.sessionToken) {
    this.config.sessionToken = crypto.randomBytes(8).toString("hex")
    this.log.verbose("request id", this.config.sessionToken)
  }

  var opts = {
    url          : uri,
    method       : method,
    headers      : headers,
    localAddress : this.config.proxy.localAddress,
    strictSSL    : this.config.ssl.strict,
    cert         : this.config.ssl.certificate,
    key          : this.config.ssl.key,
    ca           : this.config.ssl.ca,
    agent        : getAgent(uri.protocol, this.config)
  }

  // allow explicit disabling of proxy in environment via CLI
  //
  // how false gets here is the CLI's problem (it's gross)
  if (this.config.proxy.http === false) {
    opts.proxy = null
  }
  else {
    // request will not pay attention to the NOPROXY environment variable if a
    // config value named proxy is passed in, even if it's set to null.
    var proxy
    if (uri.protocol === "https:") {
      proxy = this.config.proxy.https
    }
    else {
      proxy = this.config.proxy.http
    }
    if (typeof proxy === "string") opts.proxy = proxy
  }

  headers.version = this.version || pkg.version
  headers.accept = accept

  if (this.refer) headers.referer = this.refer

  headers["npm-session"] = this.config.sessionToken
  headers["user-agent"]  = this.config.userAgent

  return opts
}

function getAgent (protocol, config) {
  if (protocol === "https:") {
    if (!httpsAgent) {
      httpsAgent = new HttpsAgent({
        keepAlive          : true,
        localAddress       : config.proxy.localAddress,
        rejectUnauthorized : config.ssl.strict,
        ca                 : config.ssl.ca,
        cert               : config.ssl.cert,
        key                : config.ssl.key
      })
    }

    return httpsAgent
  }
  else {
    if (!httpAgent) {
      httpAgent = new HttpAgent({
        keepAlive    : true,
        localAddress : config.proxy.localAddress
      })
    }

    return httpAgent
  }
}
