const chalk = require('chalk');

const { getZone, purgeFiles } = require('./utils/cloudflare');
const { die } = require('./utils/process');
const { getFiles } = require('./utils/unpkg');

const packageName = process.argv[2];
const version = process.argv[3];

if (packageName == null) {
  die(
    'Missing the PACKAGE_NAME argument; use `node purge-cache.js PACKAGE_NAME VERSION`'
  );
}

if (version == null) {
  die(
    'Missing the VERSION argument; use `node purge-cache.js PACKAGE_NAME VERSION`'
  );
}

function groupBy(array, n) {
  const groups = [];

  while (array.length) {
    groups.push(array.splice(0, n));
  }

  return groups;
}

getFiles(packageName, version)
  .then(files => {
    console.log(
      chalk.yellow(
        `Found ${files.length} files for package ${packageName}@${version}`
      )
    );

    let urls = files.map(
      file => `https://unpkg.com/${packageName}@${version}${file.path}`
    );

    if (version === 'latest') {
      // Purge the URL w/out the "@latest" too.
      urls = urls.concat(
        files.map(file => `https://unpkg.com/${packageName}${file.path}`)
      );
    }

    return getZone('unpkg.com').then(zone => {
      let promise = Promise.resolve();

      groupBy(urls, 30).forEach(group => {
        promise = promise.then(() => {
          return purgeFiles(zone.id, group).then(data => {
            group.forEach(url => console.log(chalk.green(`Purged ${url}`)));
          });
        });
      });

      return promise;
    });
  })
  .catch(die);