import amqplib from 'amqplib';
import dotenv from 'dotenv';

dotenv.config({ path: '../.env' });

// Variables globales para la conexión y el canal
let connection;
let channel;

// Función para conectar y crear canal (solo si no está conectado)
async function connectToRabbitMQ() {
  if (!connection || !channel) {
    try {
      connection = await amqplib.connect({
        protocol: 'amqp',
        hostname: process.env.RBMQhost,
        port: process.env.RBMQport,
        username: process.env.RBMQuser,
        password: process.env.RBMQpassword,
      });
      channel = await connection.createChannel();
      console.log('Conexión establecida a RabbitMQ');
    } catch (error) {
      console.error('Error al conectar a RabbitMQ:', error.message);
      throw error; // Lanza el error para manejarlo en otro lugar si es necesario
    }
  }
}

// Función para enviar un mensaje a la cola
export async function sendMessage(message, queue) {
  try {
    await connectToRabbitMQ(); // Asegúrate de que la conexión está establecida

    await channel.assertQueue(queue, { durable: true });

    const msgBody = JSON.stringify(message);
    const msg = Buffer.from(msgBody);

    await channel.sendToQueue(queue, msg, { persistent: true });
    console.log(`Mensaje enviado a la cola "${queue}": ${msgBody}`);
    // NO cerrar la conexión aquí
  } catch (error) {
    console.error(`Error al enviar el mensaje a la cola "${queue}":`, error.message);
  }
}

// Función para cerrar la conexión y el canal (opcional, puedes llamarla en el cierre de tu aplicación)
export async function closeConnection() {
  if (channel) {
    await channel.close();
  }
  if (connection) {
    await connection.close();
  }
}
