#!/usr/bin/env node

const cp = require('child_process');
const { promisify } = require('util');
const fs = require('fs');
const pkg = require('../package.json');

const availableLanguages = pkg.availableLanguages.sort();
const exec = promisify(cp.exec);

const arrayDiff = (current, package) =>
  current.filter(locale => !package.includes(locale));

const cmd = 'compare-locales l10n.toml . `ls public/locales` --data=json';

exec(cmd)
  .then(({ stdout }) => JSON.parse(stdout))
  .then(({ summary }) => {
    const locales = Object.keys(summary)
      .filter(locale => {
        const loc = summary[locale];
        const hasMissing = Object.prototype.hasOwnProperty.call(loc, 'missing');
        const hasErrors = Object.prototype.hasOwnProperty.call(loc, 'errors');
        return !hasMissing && !hasErrors;
      })
      .sort();

    if (locales.join(',') !== availableLanguages.join(',')) {
      const missingLanguages = arrayDiff(locales, availableLanguages);

      console.log('current 100%:', JSON.stringify(locales));
      console.log('package.json:', JSON.stringify(availableLanguages));
      console.log('missing prod:', JSON.stringify(missingLanguages));

      if (process.argv.includes('--write')) {
        const pkgPath = require.resolve('../package.json');
        pkg.availableLanguages = locales;
        const str = JSON.stringify(pkg, null, 2) + '\n';
        console.log('Updating /package.json availableLanguages');
        fs.writeFileSync(pkgPath, str, 'utf-8');
      }
    } else {
      console.log('Production locales are up to date!');
    }
  })
  .catch(err => {
    console.error(err);
    process.exit(1);
  });