const path = require('path');
const builtinModules = require('module').builtinModules;
const babel = require('rollup-plugin-babel');
const commonjs = require('rollup-plugin-commonjs');
const json = require('rollup-plugin-json');
const replace = require('rollup-plugin-replace');
const resolve = require('rollup-plugin-node-resolve');
const url = require('rollup-plugin-url');

const entryManifest = require('./plugins/entryManifest');

const env = process.env.NODE_ENV || 'development';
const dev = env === 'development';

// Allow storing env vars in .env in dev.
if (dev) require('dotenv').config();

const manifest = entryManifest();

const client = {
  input: ['modules/client/main.js', 'modules/client/autoIndex.js'],
  output: [
    {
      // ESM version for modern browsers
      format: 'esm',
      dir: 'public/_client',
      entryFileNames: '[name]-[hash].js',
      chunkFileNames: '[name]-[hash].js'
    },
    {
      // SystemJS version for older browsers
      format: 'system',
      dir: 'public/_client',
      entryFileNames: '[name]-[hash].system.js',
      chunkFileNames: '[name]-[hash].system.js'
    }
  ],
  plugins: [
    manifest.record({ publicPath: '/_client/' }),
    babel({ exclude: /node_modules/ }),
    json(),
    resolve(),
    commonjs({
      namedExports: {
        'node_modules/react/index.js': [
          'createContext',
          'createElement',
          'forwardRef',
          'Component',
          'Fragment'
        ]
      }
    }),
    replace({
      'process.env.NODE_ENV': JSON.stringify(env)
    }),
    url({
      limit: 5 * 1024,
      publicPath: '/_client/'
    })
  ]
};

const secretKey = require('./secretKey');
const fnsPkg = require('./functions/package.json');

const fnsDeps = (dev
  ? Object.keys(fnsPkg.dependencies).concat(
      Object.keys(fnsPkg.devDependencies || {})
    )
  : Object.keys(fnsPkg.dependencies)
).concat('react-dom/server');

const functions = [
  {
    external: id => true,
    input: path.resolve(__dirname, 'modules/functions/index.js'),
    output: { file: 'functions/index.js', format: 'cjs' },
    plugins: [
      babel(),
      json(),
      replace({
        'process.env.NODE_ENV': JSON.stringify(env)
      })
    ]
  }
].concat(
  [
    // 'serveAuth',
    'serveAutoIndexPage',
    'serveMainPage',
    'serveNpmPackageFile',
    'servePublicKey',
    'serveStats'
  ].map(functionName => {
    return {
      external: builtinModules.concat(fnsDeps),
      input: path.resolve(__dirname, `modules/functions/${functionName}.js`),
      output: { file: `functions/${functionName}.js`, format: 'cjs' },
      plugins: [
        manifest.inject({ virtualId: 'entry-manifest' }),
        babel({ exclude: /node_modules/ }),
        json(),
        resolve(),
        commonjs(),
        url({
          limit: 5 * 1024,
          publicPath: '/_client/',
          emitFiles: false
        }),
        replace({
          'process.env.NODE_ENV': JSON.stringify(env),
          'process.env.CLOUDFLARE_EMAIL': JSON.stringify(
            process.env.CLOUDFLARE_EMAIL
          ),
          'process.env.CLOUDFLARE_KEY': JSON.stringify(
            process.env.CLOUDFLARE_KEY
          ),
          'process.env.SECRET_KEY': JSON.stringify(secretKey)
        })
      ]
    };
  })
);

module.exports = [client].concat(functions);