'use strict';
const Discord = require('discord.js');
// eslint-disable-next-line no-unused-vars
const Typings = require('../typings');
const { Lesson } = require('../models');
const { dateTimeGroup } = require('../modules');
const { commandError, findGuildConfiguration, sendMsg, successReact } = require('../handlers');
/**
 * @member {commands.Command} commands.seen
 */
/**
 * Complete the \<Command> object from a \<BaseCommand>
 * @param {Discord.Guild} guild The \<Guild> that the member shares with the bot
 * @returns {Promise<Typings.Command>} The complete \<Command> object with a \<Command.execute()> method
 */
module.exports = async guild => {
	const { ids: { lessonsId }, commands: { seen }, colours } = await findGuildConfiguration(guild);
	/**
	 * Acknowledge a lesson warning, either from a message command or a message reaction
	 * @param {Typings.CommandParameters} parameters The \<CommandParameters> to execute this command
	 * @returns {Promise<void | Typings.Lesson>} The mongoose document for the lesson
	 */
	seen.execute = async ({ msg, user }) => {
		/**
		 * @type {?Typings.Lesson}
		 */
		// Find <Lesson> document by querying database for lesson channel Id
		const lessonDocument = await Lesson.findOne({ lessonId: msg.channel.id }).exec()
			.catch(error => console.error(error));
		// Resolve the instructor, depending on whether executed via command or reaction
		const instructor = user || msg.author;
		try {
			// Ensure message channel is contained within lessons category
			if (msg.channel.parentId !== lessonsId) {
				const lessonsCategory = msg.guild.channels.cache.get(lessonsId);
				throw `You can only use that command in **${lessonsCategory}**.`;
			}
			// Ensure <Lesson> has been found
			else if (!lessonDocument) throw 'Invalid lesson channel.';
			// Ensure the resolved instructor is an instructor of the lesson
			else if (!lessonDocument.instructors[instructor.id]) throw 'You are not an instructor for this lesson!';
			// Ensure the instructor has not already acknowledged receipt
			else if (lessonDocument.instructors[instructor.id].seen) throw 'You have already acknowledged this lesson warning.';
		}
		catch (thrownError) { return commandError(msg, thrownError, seen.error); }
		// Success react if executed via command
		if (!user) successReact(msg);
		// Create seen embed
		const seenEmbed = new Discord.MessageEmbed()
			.setColor(colours.success)
			.setDescription(`**${await guild.members.fetch(instructor.id).then(member => member.displayName)}** has confirmed receipt of this lesson warning.`)
			.setFooter(await dateTimeGroup(guild));
		// Send the seen embed
		sendMsg(msg.channel, { embeds: [seenEmbed] });
		// Change the instructor's seen status in the database
		lessonDocument.instructors[instructor.id].seen = true;
		lessonDocument.markModified('instructors');
		// Check whether all instructors have been marked as having acknowledged receipt of the lesson warning
		const allSeen = Object.values(lessonDocument.instructors).every(_instructor => _instructor.seen);
		if (allSeen) {
			// If so, create and send an embed to state that all instructors have acknowledged receipt
			const allSeenEmbed = new Discord.MessageEmbed()
				.setColor(colours.success)
				.setDescription('All instructors have acknowledged receipt of this lesson warning.')
				.setFooter(await dateTimeGroup(guild));
			sendMsg(msg.channel, { embeds: [allSeenEmbed] });
		}
		// Save the <Lesson> document and return it
		return await lessonDocument.save().catch(error => console.error(error));
	};
	return seen;
};source