const { statSync, existsSync, readdirSync } = require('fs');
const { join, resolve } = require('path');
const DEFAULT_ROOT = 'client/src';
const CUSTOM_ROOT = 'site/custom/src';
const DEFAULT_SCSS_ROOT = 'client/scss';
const CUSTOM_SCSS_ROOT = 'site/custom/scss';

const getFolders = path => {
  if (existsSync(path)) {
    return readdirSync(path).filter(file => statSync(join(path, file)).isDirectory());
  }
  return [];
};

const addAliasesForCustomComponentFolder = (name, aliasObject) => {
  // creates an alias for each component in the folder that is passed to this function
  const folderPath = resolve(`${CUSTOM_ROOT}/${name}`);
  const components = getFolders(folderPath);
  for (let i = 0; i < components.length; i++) {
    let folderName = components[i];
    let aliasName = `@${name}/${folderName}`;
    aliasObject[aliasName] = resolve(`${CUSTOM_ROOT}/${name}/${folderName}/`);
  }
  return aliasObject;
};

module.exports = () => {
  let moduleAliases = {};

  moduleAliases['chainquery'] = resolve('./server/chainquery');
  moduleAliases['server'] = resolve('./server');

  // aliases for configs
  moduleAliases['@config'] = resolve('site/config');
  moduleAliases['@private'] = resolve('site/private');

  // aliases for utils
  moduleAliases['@globalutils'] = resolve('utils');
  moduleAliases['@clientutils'] = resolve(`${DEFAULT_ROOT}/utils`);
  // moduleAliases['@serverutils'] = resolve('server/utils');

  // create specific aliases for locally defined components in the following folders
  moduleAliases = addAliasesForCustomComponentFolder('containers', moduleAliases);
  moduleAliases = addAliasesForCustomComponentFolder('components', moduleAliases);
  moduleAliases = addAliasesForCustomComponentFolder('pages', moduleAliases);

  // default component aliases
  moduleAliases['@containers'] = resolve(`${DEFAULT_ROOT}/containers`);
  moduleAliases['@components'] = resolve(`${DEFAULT_ROOT}/components`);
  moduleAliases['@pages'] = resolve(`${DEFAULT_ROOT}/pages`);
  moduleAliases['@actions'] = resolve(`${DEFAULT_ROOT}/actions`);
  moduleAliases['@reducers'] = resolve(`${DEFAULT_ROOT}/reducers`);
  moduleAliases['@sagas'] = resolve(`${DEFAULT_ROOT}/sagas`);
  moduleAliases['@app'] = resolve(`${DEFAULT_ROOT}/app.js`);


  // return finished aliases
  return moduleAliases;
};