import { ValidatedMethod } from 'meteor/mdg:validated-method';
import { RateLimiterMixin } from 'ddp-rate-limiter-mixin';
import Creatures from '/imports/api/creature/creatures/Creatures.js';
import { assertEditPermission } from '/imports/api/sharing/sharingPermissions.js';

const updateCreature = new ValidatedMethod({
  name: 'creatures.update',
  validate({ _id, path }) {
    if (!_id) return false;
    // Allowed fields
    let allowedFields = [
      'name',
      'alignment',
      'gender',
      'picture',
      'avatarPicture',
      'color',
      'settings',
    ];
    if (!allowedFields.includes(path[0])) {
      throw new Meteor.Error('Creatures.methods.update.denied',
        'This field can\'t be updated using this method');
    }
  },
  mixins: [RateLimiterMixin],
  rateLimit: {
    numRequests: 5,
    timeInterval: 5000,
  },
  run({ _id, path, value }) {
    let creature = Creatures.findOne(_id);
    assertEditPermission(creature, this.userId);
    if (value === undefined || value === null) {
      Creatures.update(_id, {
        $unset: { [path.join('.')]: 1 },
      });
    } else {
      Creatures.update(_id, {
        $set: { [path.join('.')]: value },
      });
    }
  },
});

export default updateCreature;
