package com.xindazhou.user.dal.redis.oauth2;

import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Repository;

import jakarta.annotation.Resource;
import java.util.concurrent.TimeUnit;

import static com.xindazhou.framework.social.core.redis.RedisKeyConstants.TOKEN_BLACKLIST;

/**
 * Token 黑名单 RedisDAO
 * 
 * 用于标记已被撤销的 Token，实现立即失效功能
 *
 * @author 新大洲
 */
@Repository
public class TokenBlacklistRedisDAO {

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    /**
     * 检查 Token 是否在黑名单中
     *
     * @param accessToken Token
     * @return true 表示在黑名单中（已撤销），false 表示不在黑名单中
     */
    public boolean isBlacklisted(String accessToken) {
        String redisKey = formatKey(accessToken);
        return Boolean.TRUE.equals(stringRedisTemplate.hasKey(redisKey));
    }

    /**
     * 将 Token 加入黑名单
     *
     * @param accessToken Token
     * @param expireSeconds 过期时间（秒），通常等于 Token 的过期时间
     */
    public void addToBlacklist(String accessToken, long expireSeconds) {
        String redisKey = formatKey(accessToken);
        if (expireSeconds > 0) {
            // 设置过期时间，避免黑名单无限增长
            stringRedisTemplate.opsForValue().set(redisKey, "1", expireSeconds, TimeUnit.SECONDS);
        }
    }

    /**
     * 从黑名单中移除 Token（通常不需要，因为会自动过期）
     *
     * @param accessToken Token
     */
    public void removeFromBlacklist(String accessToken) {
        String redisKey = formatKey(accessToken);
        stringRedisTemplate.delete(redisKey);
    }

    private static String formatKey(String accessToken) {
        return String.format(TOKEN_BLACKLIST, accessToken);
    }

}

