package com.seer.teach.teacher.common.utils;

import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

/**
 * 用户学习题目字符串缓存（基于 Guava Cache）
 * <p>
 * 功能：
 * - 存储 userId -> String
 * - 即取即删（poll）
 * - 自动过期：10 秒未取自动清除
 * <p>
 * 优点：
 * - 无需手动调度线程池
 * - Guava 自动管理内存与过期清理
 *
 * @author Captain
 * @since 2025-10-12
 */
@Slf4j
@Component
public class UserQuestionTextCache {

    /**
     * Guava 本地缓存：userId -> String
     */
    private final Cache<Integer, String> cache = CacheBuilder.newBuilder()
            .expireAfterWrite(30, TimeUnit.MINUTES)
            .removalListener(notification ->
                    log.info("用户 提问数据： {} 的缓存被移除（原因：过期）", notification.getKey()))
            .build();

    /**
     * 保存内容
     *
     * @param userId 用户ID
     * @param value  缓存内容
     */
    public void put(Integer userId, String value) {
        if (userId == null || value == null) return;
        cache.put(userId, value);
    }

    /**
     * 获取并删除（即取即删）
     *
     * @param userId 用户ID
     * @return 缓存内容或 null
     */
    public String poll(Integer userId) {
        if (userId == null) return null;
        String value = cache.getIfPresent(userId);
        if (value != null) {
            cache.invalidate(userId);
        }
        return value;
    }

    /**
     * 检查是否存在
     *
     * @param userId 用户ID
     * @return true 表示存在
     */
    public boolean exists(Integer userId) {
        return userId != null && cache.getIfPresent(userId) != null;
    }

    /**
     * 清空所有缓存
     */
    public void clearAll() {
        cache.invalidateAll();
    }
}
