const url = require("url");
const https = require("https");

const config = require("../config");
const bufferStream = require("./bufferStream");
const agent = require("./registryAgent");

function parseJSON(res) {
  return bufferStream(res).then(JSON.parse);
}

function fetchNpmPackageInfo(packageName) {
  return new Promise((resolve, reject) => {
    const encodedPackageName =
      packageName.charAt(0) === "@"
        ? `@${encodeURIComponent(packageName.substring(1))}`
        : encodeURIComponent(packageName);

    const infoURL = `${config.registryURL}/${encodedPackageName}`;

    console.log(
      `info: Fetching package info for ${packageName} from ${infoURL}`
    );

    const { hostname, pathname } = url.parse(infoURL);
    const options = {
      agent: agent,
      hostname: hostname,
      path: pathname,
      headers: {
        Accept: "application/json"
      }
    };

    https
      .get(options, res => {
        if (res.statusCode === 200) {
          resolve(parseJSON(res));
        } else {
          reject(res);
        }
      })
      .on("error", reject);
  });
}

module.exports = fetchNpmPackageInfo;