'use strict';

var	async = require('async'),
	db = require('../database'),
	plugins = require('../plugins');

module.exports = function (Groups) {

	Groups.ownership = {};

	Groups.ownership.isOwner = function (uid, groupName, callback) {
		if (!uid) {
			return callback(null, false);
		}
		db.isSetMember('group:' + groupName + ':owners', uid, callback);
	};

	Groups.ownership.isOwners = function (uids, groupName, callback) {
		if (!Array.isArray(uids)) {
			return callback(null, []);
		}

		db.isSetMembers('group:' + groupName + ':owners', uids, callback);
	};

	Groups.ownership.grant = function (toUid, groupName, callback) {
		// Note: No ownership checking is done here on purpose!
		async.waterfall([
			function (next) {
				db.setAdd('group:' + groupName + ':owners', toUid, next);
			},
			function (next) {
				plugins.fireHook('action:group.grantOwnership', {uid: toUid, groupName: groupName});
				next();
			}
		], callback);
	};

	Groups.ownership.rescind = function (toUid, groupName, callback) {
		// Note: No ownership checking is done here on purpose!

		// If the owners set only contains one member, error out!
		async.waterfall([
			function (next) {
				db.setCount('group:' + groupName + ':owners', next);
			},
			function (numOwners, next) {
				if (numOwners <= 1) {
					return next(new Error('[[error:group-needs-owner]]'));
				}
				db.setRemove('group:' + groupName + ':owners', toUid, next);
			},
			function (next) {
				plugins.fireHook('action:group.rescindOwnership', {uid: toUid, groupName: groupName});
				next();
			}
		], callback);
	};
};
