const { SlashCommandBuilder, EmbedBuilder, MessageFlags } = require('discord.js');
const { verifyLinkCode, updateUserLinkWithUsername } = require('../../src/core/database.js');
const axios = require('axios');

module.exports = {
    data: new SlashCommandBuilder()
        .setName('lier')
        .setDescription('Lier manuellement un compte Discord à un compte Palworld (Admin)')
        .addStringOption(option =>
            option.setName('pseudo-palworld')
                .setDescription('Le pseudo du joueur sur Palworld')
                .setRequired(true))
        .addUserOption(option =>
            option.setName('discord-account')
                .setDescription('Le compte Discord à lier')
                .setRequired(true)),
    
    async execute(interaction) {
        try {
            await interaction.deferReply({ flags: MessageFlags.Ephemeral });

            const palworldName = interaction.options.getString('pseudo-palworld');
            const discordUser = interaction.options.getUser('discord-account');

            // Récupérer le Steam ID depuis l'API Palworld
            const response = await axios({
                method: 'get',
                url: 'http://play.louismazin.ovh:8212/v1/api/players',
                headers: { 
                    'Accept': 'application/json', 
                    'Authorization': `Basic ${process.env.PALWORLD_API_TOKEN}`
                }
            });

            const players = response.data.players || {};
            let playerData = null;

            // Chercher le joueur par nom
            for (const [id, player] of Object.entries(players)) {
                if (player.name === palworldName) {
                    playerData = {
                        steamId: player.userId,
                        playerId: player.playerId,
                        name: player.name
                    };
                    break;
                }
            }

            if (!playerData) {
                return interaction.editReply({
                    content: `❌ Impossible de trouver le joueur **${palworldName}** sur le serveur.\n\n` +
                             `💡 Le joueur doit être connecté sur le serveur Palworld.`,
                    flags: MessageFlags.Ephemeral
                });
            }

            // Créer un code temporaire pour la liaison manuelle
            const { generateLinkCode } = require('../../src/core/database.js');
            const code = await generateLinkCode(discordUser.id);

            // Effectuer la liaison immédiatement
            const result = await verifyLinkCode(code, playerData.steamId, playerData.name, playerData.playerId);

            if (result.success) {
                await updateUserLinkWithUsername(discordUser.id, discordUser.tag);

                // Ajouter le rôle de joueur lié
                try {
                    const guild = interaction.guild;
                    const member = await guild.members.fetch(discordUser.id);
                    const linkedRole = guild.roles.cache.get('1467491093649035475');
                    if (linkedRole && !member.roles.cache.has(linkedRole.id)) {
                        await member.roles.add(linkedRole);
                        console.log(`✅ Rôle ajouté à ${discordUser.tag}`);
                    }
                } catch (roleError) {
                    console.error('Erreur lors de l\'ajout du rôle:', roleError);
                }

                const embed = new EmbedBuilder()
                    .setColor(0x00FF00)
                    .setTitle('✅ Liaison manuelle réussie')
                    .addFields(
                        { name: '👤 Discord', value: `${discordUser.tag} (<@${discordUser.id}>)`, inline: false },
                        { name: '🎮 Palworld', value: palworldName, inline: true },
                        { name: '🆔 Steam ID', value: `\`${playerData.steamId}\``, inline: true },
                        { name: '🎯 Player ID', value: `\`${playerData.playerId}\``, inline: false }
                    )
                    .setTimestamp();

                // Envoyer un MP au joueur lié
                await discordUser.send(
                    `✅ **Liaison effectuée par un administrateur**\n\n` +
                    `Votre compte Discord a été lié à votre compte Palworld:\n` +
                    `🎮 Nom Palworld: **${playerData.name}**\n` +
                    `🆔 Steam ID: \`${playerData.steamId}\`\n` +
                    `🎯 Player ID: \`${playerData.playerId}\``
                ).catch(() => {});

                await interaction.editReply({ embeds: [embed], flags: MessageFlags.Ephemeral });
            } else {
                await interaction.editReply({
                    content: `❌ Erreur lors de la liaison: ${result.message}`,
                    flags: MessageFlags.Ephemeral
                });
            }

        } catch (error) {
            console.error('Erreur lors de la liaison manuelle:', error);
            await interaction.editReply({
                content: '❌ Une erreur est survenue lors de la liaison.',
                flags: MessageFlags.Ephemeral
            });
        }
    },
};
