// This script creates output that is copy/pasted into /internal/node/node_versions.bzl to
// add all published yarn packages < 2.0.0
// See the update-nodejs-versions script in package.json

const https = require('https');
const { execSync } = require('child_process');
const { mkdirSync, createWriteStream } = require('fs');
const { join } = require('path');
const { tmpdir } = require('os');

const MAX_VERSION = [1, 99, 99];

async function getJson(url) {
    return new Promise((resolve, reject) => {
        https.get(url, (res) => {
        if (res.statusCode !== 200) {
            console.error(res);
            return reject();
        }
        
        let body = '';
        res.on("data", (chunk) => body += chunk);
        res.on("end", () => resolve(JSON.parse(String(body))));
        });
    });
}

function httpDownload(url, dest, resolve, reject) {
  https.get(url, (response) => {
    if(response.statusCode === 301 || response.statusCode === 302) {
      return httpDownload(response.headers.location, dest, resolve, reject)
    }

    if (response.statusCode === 404) {
      reject();
      return;
    }

    const file = createWriteStream(dest);

    response.pipe(file);

    file.on('finish', () => {
      file.end();
      resolve();
    });
  });
}

function downloadFile(url, dest) {
  return new Promise((resolve, reject) => httpDownload(url, dest, resolve, reject));
};

function versionCompare(lhs, rhs) {
  if (lhs[0] !== rhs[0]) {
    return lhs[0] - rhs[0];
  }
  if (lhs[1] !== rhs[1]) {
    return lhs[1] - rhs[1];
  }
  return lhs[2] - rhs[2];
}

async function getYarnVersions() {
  const json = await getJson("https://registry.npmjs.org/yarn");
  const versions = Object.values(json.versions);

  const validVersions = (versions.map(({ version }) => version.split('.').map(Number))
              .filter(
                  (version) => versionCompare(version, MAX_VERSION) <= 0)
              .sort(versionCompare)
              .map(version => version.join('.')));

  return validVersions.map(version => ({
    version,
    name: `yarn-v${version}`,
    url: `https://github.com/yarnpkg/yarn/releases/download/v${version}/yarn-v${version}.tar.gz`,
    tar: `yarn-v${version}.tar.gz`
  }));
}

async function getYarnSha(url, dir) {
  await downloadFile(url, dir);
  return execSync(`shasum -a 256 ${dir}`, {silent: true, encoding: 'utf-8'}).split(' ')[0];
}

async function getYarnVersionsSha(yarnVersions) {
    const tmpDir = tmpdir();
    mkdirSync(tmpDir, {recursive: true});

    const data = [];
    for (const ver of yarnVersions) {
      try {
        const sha = await getYarnSha(ver.url, join(tmpDir, ver.version))
        const info = { ...ver, sha }
        data.push(info);
      } catch (e) {
        // not found
      }
    }

    return data;
}

async function main() {
  const versions = await getYarnVersions();
  const yarnVersions = await getYarnVersionsSha(versions);
  console.log('"""\nGenerated code; do not edit');
  console.log('Update by running yarn update-yarn-versions\n');
  console.log('Note that we don\'t support Yarn 2 yet, see');
  console.log('https://github.com/bazelbuild/rules_nodejs/issues/1599\n"""\n');
  // Suppress buildifier
  console.log('# @unsorted-dict-items');
  console.log('YARN_VERSIONS = {');
  yarnVersions.forEach(ver => {
    const value = `("${ver.tar}", "${ver.name}", "${ver.sha}"),`;
    console.log(`    "${ver.version}": ${value}`);
  });
  console.log("}");
}

if (require.main === module) {
  main();
}
