const { Permissions } = require("discord.js");
const languages = require("../languages/language-meta.json").map((l) => l.moment).filter((l) => l !== "en");
languages.forEach((lang) => {
	require(`moment/locale/${lang}.js`);
});

module.exports = {
	/**
	 * Gets message prefix
	 * @param {object} message The Discord message
	 * @param {object} data Server data
	 * @returns The prefix
	 */
	getPrefix(message, data) {
		if (message.channel.type !== "DM") {
			const prefixes = [
				`<@!${message.client.user.id}> `,
				`<@${message.client.user.id}> `,
				`<@!${message.client.user.id}>`,
				`<@${message.client.user.id}>`,
				message.client.user.username.toLowerCase(),
				data.guild.prefix
			];
			let prefix = null;
			prefixes.forEach((p) => {
				if (message.content.startsWith(p) || message.content.toLowerCase().startsWith(p)) prefix = p;
			});

			return prefix;
		} else {
			return true;
		}
	},

	// This function return an actual link to the support server
	async supportLink(client) {
		const guild = client.guilds.cache.get(client.config.support.id);
		const member = guild.me;
		const channel = guild.channels.cache.find((ch) => ch.permissionsFor(member.id).has(Permissions.FLAGS.CREATE_INSTANT_INVITE) && ch.type === "GUILD_TEXT" || ch.type === "GUILD_VOICE");
		if (channel) {
			const invite = await channel.createInvite({
				maxAge: 0
			}).catch(() => {});

			return invite ? invite.url : null;
		} else {
			return "";
		}
	},

	// This function sort an array
	sortByKey(array, key) {
		return array.sort(function (a, b) {
			const x = a[key];
			const y = b[key];
			return ((x < y) ? 1 : ((x > y) ? -1 : 0));
		});
	},

	// This function return a shuffled array
	shuffle(pArray) {
		const array = [];
		pArray.forEach(element => array.push(element));
		let currentIndex = array.length,
			temporaryValue, randomIndex;

		// While there remain elements to shuffle...
		while (0 !== currentIndex) {
			// Pick a remaining element...
			randomIndex = Math.floor(Math.random() * currentIndex);
			currentIndex -= 1;
			// And swap it with the current element.
			temporaryValue = array[currentIndex];
			array[currentIndex] = array[randomIndex];
			array[randomIndex] = temporaryValue;
		}

		return array;
	},

	// This function return a random number between min and max
	randomNum(min, max) {
		return Math.floor(Math.random() * (max - min)) + min;
	},

	convertTime(guild, time) {
		const absoluteSeconds = Math.floor((time / 1000) % 60);
		const absoluteMinutes = Math.floor((time / (1000 * 60)) % 60);
		const absoluteHours = Math.floor((time / (1000 * 60 * 60)) % 24);
		const absoluteDays = Math.floor(time / (1000 * 60 * 60 * 24));

		const d = absoluteDays ?
			absoluteDays === 1 ?
				guild.translate("time:ONE_DAY") :
				guild.translate("time:DAYS", {
					amount: absoluteDays
				}) :
			null;
		const h = absoluteHours ?
			absoluteHours === 1 ?
				guild.translate("time:ONE_HOUR") :
				guild.translate("time:HOURS", {
					amount: absoluteHours
				}) :
			null;
		const m = absoluteMinutes ?
			absoluteMinutes === 1 ?
				guild.translate("time:ONE_MINUTE") :
				guild.translate("time:MINUTES", {
					amount: absoluteMinutes
				}) :
			null;
		const s = absoluteSeconds ?
			absoluteSeconds === 1 ?
				guild.translate("time:ONE_SECOND") :
				guild.translate("time:SECONDS", {
					amount: absoluteSeconds
				}) :
			null;

		const absoluteTime = [];
		if (d) absoluteTime.push(d);
		if (h) absoluteTime.push(h);
		if (m) absoluteTime.push(m);
		if (s) absoluteTime.push(s);

		return absoluteTime.join(", ");
	}
};