const express = require("express"),
	utils = require("../utils"),
	CheckAuth = require("../auth/CheckAuth"),
	router = express.Router(),
	generator = require("colors-generator");

router.get("/:serverID", CheckAuth, async(req, res) => {
	// Check if the user has the permissions to edit this guild
	const guild = req.client.guilds.cache.get(req.params.serverID);
	if (!guild || !req.userInfos.displayedGuilds || !req.userInfos.displayedGuilds.find((g) => g.id === req.params.serverID)) {
		return res.render("404", {
			user: req.userInfos,
			language: req.language,
			currentURL: `${req.client.config.dashboard.baseURL}/${req.originalUrl}`
		});
	};

	// Fetch guild informations
	const guildInfos = await utils.fetchGuild(guild.id, req.client, req.user.guilds);

	const membersData = await req.client.membersData.find({ guildID: guild.id }).lean();

	const leaderboards = {
		money: sortArrayOfObjects("money", membersData),
		level: sortArrayOfObjects("level", membersData)
	};

	for (const cat in leaderboards) {
		const e = leaderboards[cat];
		if (e.length > 10) e.length = 10;
	};

	const stats = {
		money: await utils.fetchUsers(leaderboards.money, req.client),
		level: await utils.fetchUsers(leaderboards.level, req.client)
	};

	res.render("stats/guild", {
		stats,
		commands: getCommands(guildInfos.commands.filter((c) => c.date > Date.now()-604800000)),
		commandsUsage: getCommandsUsage(guildInfos.commands),
		user: req.userInfos,
		language: req.language,
		currentURL: `${req.client.config.dashboard.baseURL}/${req.originalUrl}`,
	});
});

module.exports = router;

function getCommands(commands) {
	const aDateCommand = {};
	commands.forEach((cmd) => {
		const tDate = formatDate(new Date(cmd.date));
		if (aDateCommand[tDate]) aDateCommand[tDate]++;
		else aDateCommand[tDate] = 1;
	});
	return aDateCommand;
};

function getCommandsUsage(commands) {
	const objectCount = commands.reduce((acc, curr) => {
		if (typeof acc[curr.command] == "undefined") acc[curr.command] = 1;
		else acc[curr.command] += 1;

		return acc;
	}, {});
	const percentages = getPercentagePerKey(objectCount); // [ { key: "help", percentage: 20 } ]
	const colors = generator.generate("#86bff2", percentages.length).get();
	let i = 0;
	percentages.forEach((p) => {
		p.color = colors[i];
		i++;
	});

	return percentages;
};

function getPercentagePerKey(myArray) {
	const sum = getSum(myArray);
	const arrayWithPercentages = [];
	for (const key in myArray) {
		const val = myArray[key];
		const percentage = Math.round((val / sum) * 100);
		arrayWithPercentages.push({key, percentage});
	};

	return arrayWithPercentages;
};

function getSum(myArray) {
	let sum = 0;
	for (const key in myArray) sum += myArray[key];

	return sum;
};

function sortArrayOfObjects(key, arr) {
	const array = arr.slice(0);
	return array.sort((a, b) => {
		return b[key] - a[key];
	});
};

function formatDate(date) {
	let dd = date.getDate();
	let mm = date.getMonth() + 1;
	if (dd < 10) dd = `0${dd}`
	if (mm < 10) mm = `0${mm}`
	date = `${mm}/${dd}`

	return date;
};