/**
 * @license
 * Copyright 2020 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */

const path = require('path');

// In this file word "plugin" refers to rollup plugin, not Gerrit plugin.
// By default, require(plugin_name) tries to find module plugin_name starting
// from the folder where this file (rollup.config.js) is located
// (see https://www.typescriptlang.org/docs/handbook/module-resolution.html#node
// and https://nodejs.org/api/modules.html#modules_all_together).
// So, rollup.config.js can't be in polygerrit-ui/app dir and it should be in
// tools/node_tools directory (where all plugins are installed).
// But rollup_bundle rule copy this .config.js file to another directory,
// so require(plugin_name) can't find a plugin.
// To fix it, requirePlugin tries:
// 1. resolve module id using default behavior, i.e. it starts from __dirname
// 2. if module not found - it tries to resolve module starting from rollupBin
//    location.
// This workaround also gives us additional power - we can place .config.js
// file anywhere in a source tree and add all plugins in the same package.json
// file as rollup node module.
function requirePlugin(id) {
  const rollupBinDir = path.dirname(process.argv[1]);
  const pluginPath = require.resolve(id, {paths: [__dirname, rollupBinDir]});
  return require(pluginPath);
}

const {nodeResolve} = requirePlugin('@rollup/plugin-node-resolve');
const terser = requirePlugin('@rollup/plugin-terser');
const replace = requirePlugin('@rollup/plugin-replace');

// @polymer/font-roboto-local uses import.meta.url value
// as a base path to fonts. We should substitute a correct javascript
// code to get a base path for font-roboto-local fonts.
const importLocalFontMetaUrlResolver = function() {
  return {
    name: 'import-meta-url-resolver',
    resolveImportMeta(property, data) {
      if (property === 'url' && data.moduleId.endsWith('/@polymer/font-roboto-local/roboto.js')) {
        return `window.location.origin + getBaseUrl() + '/'`;
      }
      return null;
    },
  };
};

export default {
  treeshake: false,
  onwarn: warning => {
    // No warnings from rollupjs are allowed.
    // Most of the warnings are real error in our code (for example,
    // if some import couldn't be resolved we can't continue, but rollup
    // reports it as a warning)
    throw new Error(warning.message);
  },
  output: {
    format: 'iife',
    compact: true,
    generatedCode: 'es2015',
    plugins: [
      terser({
        ecma: 2021,
        compress: {
          // An extra pass can squeeze out an extra byte or two.
          passes: 2,
        },
        output: {
          comments: false,
        },
      }),
    ],
  },
  // Context must be set to window to correctly processing global variables
  context: 'window',
  plugins: [nodeResolve({
    // By default, it tries to use page.mjs file instead of page.js
    // when importing 'page/page'.
    // TODO: page.was removed. Is something obsolete here?
    extensions: ['.js'],
    modulePaths: [path.join(process.cwd(), 'external/ui_npm/node_modules')]
  }),
  replace({
    preventAssignment: true,
    values: {
      'process.env.NODE_ENV': JSON.stringify('production'),
    },
  }),
  importLocalFontMetaUrlResolver()],
};
