const _ = require('lodash');
const debug = require('debug')('talk:graph:mutators');

const Comment = require('./comment');
const Action = require('./action');
const Tag = require('./tag');
const User = require('./user');

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

let mutators = [

  // Load in the core mutators.
  Comment,
  Action,
  Tag,
  User,

  // Load the plugin mutators from the manager.
  ...plugins
    .get('server', 'mutators').map(({plugin, mutators}) => {
      debug(`added plugin '${plugin.name}'`);

      return mutators;
    })
];

/**
 * Creates a set of mutators based on a GraphQL context.
 * @param  {Object} context the context of the GraphQL request
 * @return {Object}         object of mutators
 */
module.exports = (context) => {

  // We need to return an object to be accessed.
  return _.merge(...mutators.map((mutators) => {

    // Each set of mutators is a function which takes the context.
    return mutators(context);
  }));
};
