const recordsOrIdsValidator = (value) =>
  _.every(value, _.isPlainObject) || _.every(value, _.isString);

module.exports = {
  inputs: {
    recordsOrIds: {
      type: 'json',
      custom: recordsOrIdsValidator,
      required: true,
    },
    values: {
      type: 'json',
      required: true,
    },
    actorUser: {
      type: 'ref',
      required: true,
    },
    request: {
      type: 'ref',
    },
  },

  async fn(inputs) {
    const { values } = inputs;

    const criteria = {
      userId: inputs.actorUser.id,
    };

    if (_.every(inputs.recordsOrIds, _.isPlainObject)) {
      criteria.id = sails.helpers.utils.mapRecords(inputs.recordsOrIds);
    } else if (_.every(inputs.recordsOrIds, _.isString)) {
      criteria.id = inputs.recordsOrIds;
    }

    const notifications = await Notification.update(criteria)
      .set({ ...values })
      .fetch();

    notifications.forEach((notification) => {
      sails.sockets.broadcast(
        `user:${notification.userId}`,
        'notificationUpdate',
        {
          item: notification,
        },
        inputs.request,
      );

      sails.helpers.utils.sendWebhooks.with({
        event: 'notificationUpdate',
        data: {
          item: notification,
        },
        user: inputs.actorUser,
      });
    });

    return notifications;
  },
};
