/**
 * Copyright 2018-present Facebook.
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 * @format
 */
const path = require('path');
const fs = require('fs-extra');
const builder = require('electron-builder');
const Platform = builder.Platform;
const {
  buildFolder,
  compile,
  die,
  compileDefaultPlugins,
  getVersionNumber,
} = require('./build-utils.js');

function generateManifest(versionNumber) {
  const filePath = path.join(__dirname, '..', 'dist');
  if (!fs.existsSync(filePath)) {
    fs.mkdirSync(filePath);
  }
  fs.writeFileSync(
    path.join(__dirname, '../dist/manifest.json'),
    JSON.stringify({
      package: 'com.facebook.sonar',
      version_name: versionNumber,
    }),
  );
}

function modifyPackageManifest(buildFolder, versionNumber) {
  // eslint-disable-next-line no-console
  console.log('Creating package.json manifest');
  const manifest = require('../package.json');
  const manifestStatic = require('../static/package.json');

  // The manifest's dependencies are bundled with the final app by
  // electron-builder. We want to bundle the dependencies from the static-folder
  // because all dependencies from the root-folder are already bundled by metro.
  manifest.dependencies = manifestStatic.dependencies;
  manifest.main = 'index.js';
  manifest.version = versionNumber;
  fs.writeFileSync(
    path.join(buildFolder, 'package.json'),
    JSON.stringify(manifest, null, '  '),
  );
}

function buildDist(buildFolder) {
  const targetsRaw = [];

  if (process.argv.indexOf('--mac') > -1) {
    targetsRaw.push(Platform.MAC.createTarget(['zip']));
  }
  if (process.argv.indexOf('--linux') > -1) {
    targetsRaw.push(Platform.LINUX.createTarget(['zip']));
  }
  if (process.argv.indexOf('--win') > -1) {
    targetsRaw.push(Platform.WINDOWS.createTarget(['zip']));
  }
  if (!targetsRaw.length) {
    throw new Error('No targets specified. eg. --mac, --win, or --linux');
  }

  // merge all target maps into a single map
  let targetsMerged = [];
  for (const target of targetsRaw) {
    targetsMerged = targetsMerged.concat(Array.from(target));
  }
  const targets = new Map(targetsMerged);

  const electronDownload = {};
  if (process.env.electron_config_cache) {
    electronDownload.cache = process.env.electron_config_cache;
  }

  return builder
    .build({
      publish: 'never',
      config: {
        appId: `com.facebook.sonar`,
        directories: {
          buildResources: path.join(__dirname, '..', 'static'),
          output: path.join(__dirname, '..', 'dist'),
        },
        electronDownload,
        npmRebuild: false,
      },
      projectDir: buildFolder,
      targets,
    })
    .catch(die);
}

function copyStaticFolder(buildFolder) {
  fs.copySync(path.join(__dirname, '..', 'static'), buildFolder, {
    dereference: true,
  });
}

(async () => {
  const dir = await buildFolder();
  // eslint-disable-next-line no-console
  console.log('Created build directory', dir);
  copyStaticFolder(dir);
  await compileDefaultPlugins(path.join(dir, 'defaultPlugins'));
  await compile(dir, path.join(__dirname, '..', 'src', 'init.js'));
  const versionNumber = getVersionNumber();
  modifyPackageManifest(dir, versionNumber);
  generateManifest(versionNumber);
  await buildDist(dir);
  // eslint-disable-next-line no-console
  console.log('✨  Done');
  process.exit();
})();

@@ -277,24 +277,73 @@
 -builder');%0A
+const cp = require('child-process-es6-promise');%0A
 const Platfo
@@ -365,16 +365,16 @@
 atform;%0A
-
 const %7B%0A
@@ -1610,16 +1610,49 @@
 aw = %5B%5D;
+%0A  const postBuildCallbacks = %5B%5D;
 %0A%0A  if (
@@ -1729,38 +1729,216 @@
 .createTarget(%5B'
-zip'%5D)
+dir'%5D));%0A    postBuildCallbacks.push(() =%3E%0A      cp.spawn('zip', %5B'-yr9', '../Flipper-mac.zip', 'Flipper.app'%5D, %7B%0A        cwd: path.join(__dirname, '..', 'dist', 'mac'),%0A      %7D),%0A    
 );%0A  %7D%0A  if (pro
@@ -2985,15 +2985,78 @@
 ts,%0A
-
     %7D)%0A
+    .then(() =%3E Promise.all(postBuildCallbacks.map(p =%3E p())))%0A
     

Fix Mac ZIP building