import R from 'ramda'

// This is a mock of webpack's require.context, for testing purposes
if (typeof __webpack_require__ === 'undefined') {
  const fs = require('fs');
  const path = require('path');

  require.context = (base = '.', scanSubDirectories = false, regularExpression = /\.js$/) => {
    const yaml = require('js-yaml');

    const files = {};

    function readDirectory(directory) {
      fs.readdirSync(directory).forEach((file) => {
        const fullPath = path.resolve(directory, file);

        if (fs.statSync(fullPath).isDirectory()) {
          if (scanSubDirectories) readDirectory(fullPath);

          return;
        }

        if (!regularExpression.test(fullPath)) return;

        files[fullPath] = true;
      });
    }

    readDirectory(path.resolve(__dirname, base));

    function Module(file) {
      return yaml.safeLoad(fs.readFileSync(file, 'utf8'));
    }

    Module.keys = () => Object.keys(files);

    return Module;
  };
}

// This array can't be generated, as the arguments to require.context must be literals :-|
let directoryLoaders =
  [
    require.context('../../règles/rémunération-travail/cdd',
                    true, /.yaml$/),
    require.context('../../règles/rémunération-travail/entités/ok',
                    true, /.yaml$/),
    require.context('../../règles/rémunération-travail/cotisations/ok',
                    true, /.yaml$/),
  ]

// require.context returns an object which
// a) is a function behaving like 'requires', taking a filename and returning a module and
// b) has additional properties, some function-valued; keys() returns the files matched
// A "module" is simply the contents of a file according to a Webpack loader; this can be JS, JSON, etc.
// Thus, this weird loadAll returns an array, each item of which is the contents of each file in a directory
let loadAll = directoryLoaderFunction =>
  directoryLoaderFunction.keys().map(directoryLoaderFunction)

let rules = R.pipe(
  R.map(loadAll),
  R.flatten,
  R.reject(R.isNil)
)(directoryLoaders)

export default rules