const { SlashCommandBuilder, EmbedBuilder, MessageFlags } = require('discord.js');
const { getWebSocketStatus, forceWebSocketReconnect } = require('../../src/monitoring/consoleMonitor.js');

module.exports = {
    data: new SlashCommandBuilder()
        .setName('diagnostique-ws')
        .setDescription('Vérifier l\'état du WebSocket et forcer une reconnexion si nécessaire')
        .addBooleanOption(option =>
            option.setName('reconnect')
                .setDescription('Forcer une reconnexion du WebSocket')
                .setRequired(false)
        ),
    
    async execute(interaction) {
        try {
            const forceReconnect = interaction.options.getBoolean('reconnect') || false;
            
            if (forceReconnect) {
                await interaction.reply({
                    content: '🔄 Reconnexion forcée du WebSocket en cours...',
                    flags: MessageFlags.Ephemeral
                });
                
                await forceWebSocketReconnect();
                
                // Attendre un peu pour laisser le temps de se reconnecter
                await new Promise(resolve => setTimeout(resolve, 3000));
            }
            
            const status = getWebSocketStatus();
            
            const embed = new EmbedBuilder()
                .setColor(status.hasWebSocket && status.wsState === 'OPEN' ? 0x00FF00 : 0xFF0000)
                .setTitle('🔌 Diagnostic WebSocket')
                .addFields(
                    { name: '📊 Monitoring Actif', value: status.isMonitoring ? '✅ Oui' : '❌ Non', inline: true },
                    { name: '🔗 WebSocket Présent', value: status.hasWebSocket ? '✅ Oui' : '❌ Non', inline: true },
                    { name: '📡 État Connexion', value: status.wsState || 'N/A', inline: true },
                    { name: '🔄 En cours de connexion', value: status.isConnecting ? '⏳ Oui' : '✅ Non', inline: true },
                    { name: '💓 Heartbeat Actif', value: status.hasHeartbeat ? '✅ Oui' : '❌ Non', inline: true },
                    { name: '⏱️ Timeout Heartbeat', value: status.hasHeartbeatTimeout ? '✅ Oui' : '❌ Non', inline: true },
                    { name: '🔍 Vérification Auto', value: status.hasCheckInterval ? '✅ Oui' : '❌ Non', inline: true },
                    { name: '⏱️ Reconnexion Planifiée', value: status.hasPendingReconnect ? '⏳ Oui' : '❌ Non', inline: true },
                    { name: '🔁 Délai Reconnexion', value: `${Math.round(status.reconnectDelayMs / 1000)}s`, inline: true },
                    { name: '🔄 Refresh Credentials', value: status.hasRefreshInterval ? '✅ Oui' : '❌ Non', inline: true }
                )
                .setTimestamp();
            
            if (status.connectionTimestamp) {
                embed.addFields({ name: '🕐 Dernière Connexion', value: status.connectionTimestamp, inline: false });
            }
            
            if (status.lastHeartbeatResponse) {
                const timeSinceResponse = status.timeSinceLastResponse ? `${status.timeSinceLastResponse}s` : 'N/A';
                embed.addFields({ name: '💓 Dernière Réponse Serveur', value: `${status.lastHeartbeatResponse}\n⏱️ Il y a ${timeSinceResponse}`, inline: false });
            }
            
            if (status.monitoringStartTimestamp) {
                embed.addFields({ name: '🚀 Démarrage Monitoring', value: status.monitoringStartTimestamp, inline: false });
            }
            
            // Recommandations
            let recommendations = '';
            if (!status.isMonitoring) {
                recommendations += '⚠️ Le monitoring n\'est pas actif. Redémarrer le bot.\n';
            }
            if (!status.hasWebSocket || status.wsState !== 'OPEN') {
                recommendations += '⚠️ Le WebSocket n\'est pas connecté. Utilisez `/diagnostique-ws reconnect:True` pour forcer une reconnexion.\n';
            }
            if (status.hasPendingReconnect) {
                recommendations += `ℹ️ Une reconnexion est prévue dans ${Math.round(status.reconnectDelayMs / 1000)}s.\n`;
            }
            if (status.timeSinceLastResponse && status.timeSinceLastResponse > 45) {
                recommendations += `⚠️ Aucune réponse du serveur depuis ${status.timeSinceLastResponse}s (timeout dans ${60 - status.timeSinceLastResponse}s)\n`;
            }
            
            if (recommendations) {
                embed.addFields({ name: '💡 Recommandations', value: recommendations, inline: false });
            } else {
                embed.addFields({ name: '✅ Statut', value: 'Tout fonctionne normalement !', inline: false });
            }
            
            if (forceReconnect) {
                await interaction.editReply({ content: null, embeds: [embed], flags: MessageFlags.Ephemeral });
            } else {
                await interaction.reply({ embeds: [embed], flags: MessageFlags.Ephemeral });
            }
            
        } catch (error) {
            console.error('[DIAGNOSTIQUE-WS] Erreur:', error);
            await interaction.reply({
                content: '❌ Erreur lors du diagnostic',
                flags: MessageFlags.Ephemeral
            }).catch(() => {});
        }
    },
};
