'use strict';

const async = require('async');

const hooks = require('./hooks');
const moduleManager = require("../../index");

const db = moduleManager.modules["db"];
const utils = moduleManager.modules["utils"];
const logger = moduleManager.modules["logger"];
const activities = moduleManager.modules["activities"];

module.exports = {
	/**
	 * Gets a set of activities
	 *
	 * @param session
	 * @param {String} userId - the user whose activities we are looking for
	 * @param {Integer} set - the set number to return
	 * @param cb
	 */
	getSet: (session, userId, set, cb) => {
		async.waterfall([
			next => {
				db.models.activity.find({ userId, hidden: false }).skip(15 * (set - 1)).limit(15).sort("createdAt").exec(next);
			},
		], async (err, activities) => {
			if (err) {
				err = await utils.getError(err);
				logger.error("ACTIVITIES_GET_SET", `Failed to get set ${set} from activities. "${err}"`);
				return cb({ status: 'failure', message: err });
			}

			logger.success("ACTIVITIES_GET_SET", `Set ${set} from activities obtained successfully.`);
			cb({ status: "success", data: activities });
		});
	},

	/**
	 * Hides an activity for a user
	 * 
	 * @param session
	 * @param {String} activityId - the activity which should be hidden
	 * @param cb
	 */
	hideActivity: hooks.loginRequired((session, activityId, cb) => {
		async.waterfall([
			next => {
				db.models.activity.updateOne({ _id: activityId }, { $set: { hidden: true } }, next);
			}
		], async err => {
			if (err) {
				err = await utils.getError(err);
				logger.error("ACTIVITIES_HIDE_ACTIVITY", `Failed to hide activity ${activityId}. "${err}"`);
				return cb({ status: "failure", message: err });
			}
			
			logger.success("ACTIVITIES_HIDE_ACTIVITY", `Successfully hid activity ${activityId}.`);
			cb({ status: "success" })
		});
	})
};