using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System.Text;

var factory = new ConnectionFactory
{
    HostName = "rabbitmq",
    UserName = "admin",
    Password = "admin"
};
using var connection = await factory.CreateConnectionAsync();
using var channel = await connection.CreateChannelAsync();

var queueName = "slow_queue";
var exchangeName = "logs_exchange";
await channel.QueueDeclareAsync(queue: queueName, durable: true, exclusive: false, autoDelete: false, arguments: null);

await channel.QueueBindAsync(queue: queueName, exchange: exchangeName, routingKey: "");

Console.WriteLine("[Consumer1] Waiting for messages...");

while (true)
{
    var consumer = new AsyncEventingBasicConsumer(channel);
    consumer.ReceivedAsync += (model, ea) =>
    {
        var body = ea.Body.ToArray();
        var message = Encoding.UTF8.GetString(body);
        Console.WriteLine($"[Consumer1] Received: {message}");

        Thread.Sleep(new Random().Next(2000, 3000));

        Console.WriteLine("[Consumer1] Done processing");
        channel.BasicAckAsync(deliveryTag: ea.DeliveryTag, multiple: false);
        return Task.CompletedTask;
    };

    await channel.BasicConsumeAsync(queue: queueName, autoAck: false, consumer: consumer);
}