const { SlashCommandBuilder, EmbedBuilder } = require("discord.js"); const { saveGuildBackup, listUserBackups, deleteUserBackup, restoreUserBackup, getBackupInfo } = require("../../utils/backupManager.js"); module.exports = { data: new SlashCommandBuilder() .setName("backup") .setDescription("📦 Gère vos sauvegardes personnelles du serveur") .addSubcommand(sub => sub.setName("create").setDescription("💾 Crée une nouvelle sauvegarde")) .addSubcommand(sub => sub.setName("list").setDescription("📜 Affiche vos sauvegardes")) .addSubcommand(sub => sub.setName("load") .setDescription("🔁 Restaure une sauvegarde") .addStringOption(opt => opt.setName("id").setDescription("ID de la sauvegarde").setRequired(true))) .addSubcommand(sub => sub.setName("delete") .setDescription("🗑️ Supprime une sauvegarde") .addStringOption(opt => opt.setName("id").setDescription("ID de la sauvegarde").setRequired(true))) .addSubcommand(sub => sub.setName("info") .setDescription("ℹ️ Affiche les informations d'une sauvegarde") .addStringOption(opt => opt.setName("id").setDescription("ID de la sauvegarde").setRequired(true))), async execute(interaction) { const sub = interaction.options.getSubcommand(); const userId = interaction.user.id; const guild = interaction.guild; if (sub === "create") { await interaction.deferReply({ ephemeral: true }); try { const result = await saveGuildBackup(guild, userId); const embed = new EmbedBuilder() .setColor("#4ECDC4") .setTitle("💾 Sauvegarde créée avec succès !") .setDescription(`Serveur : **${guild.name}**`) .addFields( { name: "🆔 ID de sauvegarde", value: `\`${result.backupId}\``, inline: false }, { name: "📜 Rôles sauvegardés", value: `${result.rolesCount}`, inline: true }, { name: "📺 Salons sauvegardés", value: `${result.channelsCount}`, inline: true } ) .setFooter({ text: "Sauvegardes personnelles - Maximum 10" }) .setTimestamp(); await interaction.editReply({ embeds: [embed] }); } catch (err) { console.error(err); await interaction.editReply(`❌ ${err.message}`); } } else if (sub === "list") { await interaction.deferReply({ ephemeral: true }); try { const backups = await listUserBackups(userId); if (!backups.length) return interaction.editReply("📭 Vous n’avez aucune sauvegarde."); const embed = new EmbedBuilder() .setColor("#FFD700") .setTitle(`📜 Vos sauvegardes (${backups.length}/10)`) .setDescription(backups.map(b => `🆔 **${b.backup_id}**\nServeur : **${b.guild_name}**\n🕒 ` ).join("\n━━━━━━━━━━━━━━\n")) .setFooter({ text: "Utilisez /backup load ou /backup delete" }); await interaction.editReply({ embeds: [embed] }); } catch (err) { console.error(err); await interaction.editReply(`❌ ${err.message}`); } } else if (sub === "load") { await interaction.deferReply({ ephemeral: true }); const backupId = interaction.options.getString("id"); try { await restoreUserBackup(guild, userId, backupId); await interaction.editReply(`✅ Sauvegarde **${backupId}** restaurée avec succès !`); } catch (err) { console.error(err); await interaction.editReply(`❌ ${err.message}`); } } else if (sub === "delete") { await interaction.deferReply({ ephemeral: true }); const backupId = interaction.options.getString("id"); try { const deleted = await deleteUserBackup(userId, backupId); if (!deleted) return interaction.editReply("⚠️ Sauvegarde introuvable."); await interaction.editReply(`🗑️ Sauvegarde **${backupId}** supprimée.`); } catch (err) { console.error(err); await interaction.editReply("❌ Une erreur est survenue lors de la suppression."); } } else if (sub === "info") { await interaction.deferReply({ ephemeral: true }); const backupId = interaction.options.getString("id"); try { const info = await getBackupInfo(backupId, userId); const embed = new EmbedBuilder() .setColor("#00FF00") .setTitle(`ℹ️ Infos sauvegarde ${backupId}`) .addFields( { name: "📜 Rôles", value: info.roles.length ? info.roles.join("\n") : "Aucun rôle", inline: true }, { name: "📁 Catégories", value: info.categories.length ? info.categories.join("\n") : "Aucune catégorie", inline: true }, { name: "🆔 ID", value: backupId, inline: false } ) .setFooter({ text: "Informations sur la sauvegarde" }) .setTimestamp(); await interaction.editReply({ embeds: [embed] }); } catch (err) { console.error(err); await interaction.editReply(`❌ ${err.message}`); } } } };