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

const PLATFORMS = {
  "_DARWIN_AMD64": "esbuild-darwin-64",
  "_DARWIN_ARM64": "esbuild-darwin-arm64",
  "_LINUX_AMD64": "esbuild-linux-64",
  "_LINUX_ARM64": "esbuild-linux-arm64",
  "_WINDOWS_AMD64": "esbuild-windows-64"
}

function replaceFileContent(filepath, replacements) {
  let fileContent = readFileSync(filepath, 'utf8');

  replacements.forEach(replacement => {
    const match = replacement[0].exec(fileContent);

    if(match.length > 1) {
      fileContent = fileContent.replace(match[1], replacement[1]);
    }
  });

  writeFileSync(filepath, fileContent);
}

function fetch(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 downloadFile(url, dest) {
  return new Promise((resolve, reject) => {
    const file = createWriteStream(dest);

    https.get(url, (response) => response.pipe(file));
    file.on('finish', () => {
      file.end();
      resolve();
    }); 
  });
};

async function main() {
  if(process.argv.length !== 2 && process.argv.length !== 3) {
    console.log("Expected number of arguments is 0 or 1");
    process.exit(1);
  }

  let version;
  if(process.argv.length === 3) {
    version = process.argv[2];
  } else {
    version = (await fetch('https://registry.npmjs.org/esbuild/latest')).version;
  }

  const tmpDir = tmpdir();
  mkdirSync(tmpDir, {recursive: true});

  const replacements = await Promise.all(Object.entries(PLATFORMS).map(async ([_var, platform]) => {
    const downloadPath = join(tmpDir, platform);

    await downloadFile(`https://registry.npmjs.org/${platform}/-/${platform}-${version}.tgz`, downloadPath);
    const shasum = execSync(`shasum -a 256 ${downloadPath}`, {silent: true, encoding: 'utf-8'}).split(' ')[0];

    return [new RegExp(`${_var}_SHA = "(.+?)"`, 's'), shasum];
  }));

  replacements.push([/_VERSION = "(.+?)"/, version]);
  replaceFileContent('toolchains/esbuild/esbuild_packages.bzl', replacements);

  // update package.json used for API wrapper
  replaceFileContent('toolchains/esbuild/package.json', [[/"esbuild": "(.+?)"/, version]]);
  execSync(`npm i --package-lock-only`, {silent: true, cwd: 'toolchains/esbuild'});
}

main();