package rabbitmq

import (
	configYaml "common/configsYaml"
	"goutil/logUtilPlus"
	"strconv"
)

// ConsumeData 消费mq数据
func ConsumeData(handler func(data string) error) {

	// 确保通道启用了 Publisher Confirms
	if err := RabbitMQChannel.Confirm(false); err != nil {
		logUtilPlus.ErrorLog("channel could not be put into confirm mode: %w", err)
	}

	//循环数据库数量
	for _, index := range configYaml.GetDBNum() {

		rabbitMQName := configYaml.GetRabbitMQName() + ":" + strconv.Itoa(index)

		// 注册一个消费者
		msgs, err := RabbitMQChannel.Consume(
			rabbitMQName, // 队列名称
			"",           // 消费者名称
			false,        // 是否自动确认
			false,        // 是否排他
			false,        // 是否本地
			false,        // 是否阻塞
			nil,          // 其他参数
		)
		if err != nil {
			logUtilPlus.ErrorLog("Failed to register a consumer，err:%s", err.Error())
		}

		// 启动一个 goroutine 来处理消息
		go func() {
			for d := range msgs {

				// 消息处理
				if err = handler(string(d.Body)); err != nil {

					// 消息处理失败，记录错误日志

					logUtilPlus.ErrorLog("Failed to handle message, err:%s", err.Error())
				}

				// 消息处理完成后手动确认
				if err := d.Ack(false); err != nil {
					logUtilPlus.ErrorLog("Failed to acknowledge message, err:%s", err.Error())
				}
			}
		}()
	}
}
