package com.agri.quartz.task;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.data.redis.core.Cursor;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ScanOptions;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;

/**
 * JDK 8 适配版 Redis 缓存清理任务
 * 解决：1. RedisTemplate 多实例冲突  2. Cursor<byte[]> 类型不匹配  3. 空指针问题
 * 功能：批量删除 Redis 中 sub: 开头的键
 */
@Component("agriTask")
public class AgriTask {

    // 核心修复：指定注入的 Bean 名称为 "redisTemplate"（匹配自定义配置的 Bean）
    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    private static final Logger log = LoggerFactory.getLogger(AgriTask.class);

    /**
     * 每日零点执行：清理 sub: 开头的 Redis 键
     */
    public void clearInvalidCache() {
        log.info("===== 开始执行Redis sub: 键清理任务 =====");
        int deletedCount = 0;

        // 兜底获取 RedisTemplate（指定 Bean 名称，解决多实例冲突）
        if (redisTemplate == null) {
            log.error("RedisTemplate 初始化失败，清理任务终止");
            return;
        }

        try {
            // 配置 SCAN 参数：匹配 sub:*，分批遍历（每次1000条）
            ScanOptions scanOptions = ScanOptions.scanOptions()
                    .match("sub:*")
                    .count(1000)
                    .build();

            // 接收 Cursor<byte[]> 类型（JDK 8 下原生返回类型）
            Cursor<byte[]> cursor = redisTemplate.executeWithStickyConnection(connection ->
                    connection.scan(scanOptions)
            );

            // 批量删除缓冲区（存储 String 类型键）
            List<String> batchKeys = new ArrayList<>(1000);

            // 遍历字节数组类型的键，转换为 String
            while (cursor != null && cursor.hasNext()) {
                byte[] keyBytes = cursor.next();
                // 转换 byte[] -> String（UTF-8 编码，避免乱码）
                String key = new String(keyBytes, StandardCharsets.UTF_8);
                batchKeys.add(key);

                // 每攒1000个键批量删除
                if (batchKeys.size() >= 1000) {
                    deletedCount += batchKeys.size();
                    redisTemplate.delete(batchKeys);
                    log.info("批量删除 {} 个sub: 键", batchKeys.size());
                    batchKeys.clear();
                }
            }

            // 删除剩余的键
            if (!batchKeys.isEmpty()) {
                deletedCount += batchKeys.size();
                redisTemplate.delete(batchKeys);
                log.info("批量删除剩余 {} 个sub: 键", batchKeys.size());
            }

            // 关闭游标（避免资源泄漏）
            if (cursor != null) {
                try {
                    cursor.close();
                } catch (Exception e) {
                    log.error("关闭 Redis 游标失败", e);
                }
            }

            log.info("===== Redis sub: 键清理完成，总计删除 {} 个键 =====", deletedCount);

        } catch (Exception e) {
            log.error("Redis sub: 键清理失败", e);
        }
    }
    
}