package com.njcn.redis.utils;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

/**
 * Redis 消息队列工具类
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class RedisMessageQueueUtil {

    private final RedisTemplate<String, Object> redisTemplate;

    /**
     * 推送消息到队列（左推）
     *
     * @param queueKey 队列Key
     * @param message  消息内容（JSON字符串）
     */
    public void pushMessage(String queueKey, String message) {
        try {
            redisTemplate.opsForList().leftPush(queueKey, message);
        } catch (Exception e) {
            log.error("推送消息到队列失败，queueKey={}", queueKey, e);
            throw e;
        }
    }

    /**
     * 阻塞式弹出消息（右弹）
     *
     * @param queueKey 队列Key
     * @param timeout  超时时间（秒）
     * @return 消息内容，超时返回null
     */
    public String popMessage(String queueKey, long timeout) {
        try {
            Object result = redisTemplate.opsForList().rightPop(queueKey, timeout, TimeUnit.SECONDS);
            return result != null ? result.toString() : null;
        } catch (Exception e) {
            log.error("弹出消息失败，queueKey={}", queueKey, e);
            return null;
        }
    }

    /**
     * 获取队列长度（用于监控）
     *
     * @param queueKey 队列Key
     * @return 队列长度
     */
    public Long getQueueSize(String queueKey) {
        try {
            return redisTemplate.opsForList().size(queueKey);
        } catch (Exception e) {
            log.error("获取队列长度失败，queueKey={}", queueKey, e);
            return 0L;
        }
    }
}