RocketChat.Migrations.add({
	version: 19,
	up() {
		/*
		 * Migrate existing admin users to Role based admin functionality
		 * 'admin' role applies to global scope
		 */

		const admins = Meteor.users.find({
			admin: true
		}, {
			fields: {
				_id: 1,
				username: 1
			}
		}).fetch();

		admins.forEach((admin) => {
			RocketChat.authz.addUserRoles(admin._id, ['admin']);
		});

		Meteor.users.update({}, {
			$unset: {
				admin: ''
			}
		}, {
			multi: true
		});

		let usernames = _.pluck(admins, 'username').join(', ');

		console.log((`Migrate ${ usernames } from admin field to 'admin' role`).green);

		// Add 'user' role to all users
		const users = Meteor.users.find().fetch();
		users.forEach((user) => {
			RocketChat.authz.addUserRoles(user._id, ['user']);
		});

		usernames = _.pluck(users, 'username').join(', ');
		console.log((`Add ${ usernames } to 'user' role`).green);

		// Add 'moderator' role to channel/group creators
		const rooms = RocketChat.models.Rooms.findByTypes(['c', 'p']).fetch();
		return rooms.forEach((room) => {
			const creator = room && room.u && room.u._id;

			if (creator) {
				if (Meteor.users.findOne({
					_id: creator
				})) {
					return RocketChat.authz.addUserRoles(creator, ['moderator'], room._id);
				} else {
					RocketChat.models.Subscriptions.removeByRoomId(room._id);
					RocketChat.models.Messages.removeByRoomId(room._id);
					return RocketChat.models.Rooms.removeById(room._id);
				}
			}
		});
	}
});
