const ms = require('ms');

/**
 * Parse une durée en string (ex: "1h", "2d") en millisecondes
 * @param {string} duration - Durée à parser
 * @returns {number|null} - Durée en millisecondes ou null si invalide
 */
function parseDuration(duration) {
	if (!duration) return null;
	try {
		return ms(duration);
	} catch {
		return null;
	}
}

/**
 * Formate une durée en millisecondes en string lisible
 * @param {number} ms - Durée en millisecondes
 * @returns {string} - Durée formatée
 */
function formatDuration(ms) {
	if (!ms || ms < 0) return 'Permanent';
	const seconds = Math.floor(ms / 1000) % 60;
	const minutes = Math.floor(ms / (1000 * 60)) % 60;
	const hours = Math.floor(ms / (1000 * 60 * 60)) % 24;
	const days = Math.floor(ms / (1000 * 60 * 60 * 24));
	const months = Math.floor(ms / (1000 * 60 * 60 * 24 * 30));
	const years = Math.floor(ms / (1000 * 60 * 60 * 24 * 365));

	if (years) return `${years} Année${years > 1 ? 's' : ''}`;
	if (months) return `${months} Mois`;
	if (days) return `${days} Jour${days > 1 ? 's' : ''}`;
	if (hours) return `${hours} Heure${hours > 1 ? 's' : ''}`;
	if (minutes) return `${minutes} Minute${minutes > 1 ? 's' : ''}`;
	if (seconds) return `${seconds} Seconde${seconds > 1 ? 's' : ''}`;
	return 'Instantané';
}

/**
 * Formate l'uptime en string lisible
 * @param {number} seconds - Uptime en secondes
 * @returns {string} - Uptime formaté
 */
function formatUptime(seconds) {
	const days = Math.floor(seconds / 86400);
	const hours = Math.floor((seconds % 86400) / 3600);
	const minutes = Math.floor((seconds % 3600) / 60);
	const secs = Math.floor(seconds % 60);

	if (days > 0) return `${days}j ${hours}h ${minutes}m ${secs}s`;
	if (hours > 0) return `${hours}h ${minutes}m ${secs}s`;
	if (minutes > 0) return `${minutes}m ${secs}s`;
	return `${secs}s`;
}

/**
 * Trouve un canal de logs dans une guild avec vérification des permissions
 * @param {Guild} guild - La guild Discord
 * @returns {TextChannel|null} - Le canal de logs ou null
 */
function findLogChannel(guild) {
	const logChannel = guild.channels.cache.find(ch => ch.name === 'logs' && ch.isTextBased());
	if (!logChannel) return null;
	
	// Vérifier que le bot a les permissions pour envoyer des messages
	const botMember = guild.members.me;
	if (!botMember) return null;
	
	const permissions = logChannel.permissionsFor(botMember);
	if (!permissions || !permissions.has(['ViewChannel', 'SendMessages', 'EmbedLinks'])) {
		return null;
	}
	
	return logChannel;
}

/**
 * Envoie un log dans le canal de logs de manière sécurisée
 * @param {Guild} guild - La guild Discord
 * @param {Object} embedData - Les données de l'embed à envoyer
 * @returns {Promise<boolean>} - true si envoyé, false sinon
 */
async function sendLog(guild, embedData) {
	const logChannel = findLogChannel(guild);
	if (!logChannel) return false;
	
	try {
		await logChannel.send(embedData);
		return true;
	} catch (err) {
		console.warn('⚠️  Impossible d\'envoyer le log dans le canal de logs:', err.message);
		return false;
	}
}

module.exports = {
	parseDuration,
	formatDuration,
	formatUptime,
	sendLog,
};

