const fs = require('fs');
const path = require('path');
const paths = require('./paths');
const originalConfig = require('./webpack.config.dev.original');

const FRONTEND_ROOT = process.cwd();
const FRONTEND = path.join(FRONTEND_ROOT, 'src');
const STATIC = path.join(FRONTEND_ROOT, 'static');
const ESLINT = path.join(FRONTEND_ROOT, '.eslintrc');

const rules = originalConfig.module.rules.reduce((loaders, loader, index) => {
  if (index === 3) {
    loaders.push({
      test: loader.test,
      include: loader.include,
      loader: loader.loader,
      options: {
        babelrc: true,
        cacheDirectory: true
      }
    });
  } else if (index === 1) {
    loaders.push({
      exclude: loader.exclude.concat([/\.(graphql|gql)$/]),
      loader: loader.loader,
      options: loader.options
    });
  } else if (loader.include) {
    loaders.push(Object.assign({}, loader, { include: loader.include }));
  } else {
    loaders.push(loader);
  }
  return loaders;
}, []);

rules.push({
  test: /\.(graphql|gql)$/,
  exclude: /node_modules/,
  loader: require.resolve('graphql-tag/loader')
});

const aliases = Object.assign(
  {},
  originalConfig.resolve.alias,
  fs
    .readdirSync(FRONTEND)
    .map(name => path.join(FRONTEND, name))
    .filter(fullpath => fs.statSync(fullpath).isDirectory())
    .reduce(
      (aliases, fullpath) =>
        Object.assign(aliases, {
          [`@${path.basename(fullpath)}`]: fullpath
        }),
      {
        '@root': FRONTEND
      }
    )
);

originalConfig.module.rules = rules;
originalConfig.resolve.alias = aliases;
originalConfig.resolve.plugins = [];

module.exports = originalConfig;
