require('reflect-metadata');
require('@babel/register')({
  extensions: [".es6", ".es", ".jsx", ".js", ".mjs", ".ts"],
});
const loaderUtils = require('loader-utils');
const path = require('path');
const yaml = require('yaml');
const { generate } = require('../../../src/generators');

module.exports = function (source) {
  var callback = this.async();
  const location = this.resourcePath;
  const definition = yaml.parse(source);
  const options = this.getOptions();
  generate({
    definition,
    location,
    isDev: options.isDev,
    addDependency: this.addDependency
  })
    .then((output) => {
      const files = Object.entries(output).reduce((output, [key, value]) => {
        const { name, content, isStatic } = value;
        const targetName = isStatic
          ? `${isStatic}/${name}`
          : loaderUtils.interpolateName(this, `[contenthash]/${name}`, {content: content});
        const location = path.join(options.outputPath, targetName);
        const publicPath = path.join(options.publicPath, targetName);
        this.emitFile(location, content);
        return {
          ...output,
          [key]: publicPath,
        }
      }, {});
      callback(null, `module.exports = ${JSON.stringify(files)}`);
    })
    .catch(callback);
}
