package shop.alien.store.listener;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Consumer;

/**
 * Redis Key過期事件處理器
 * 支持註冊不同key前綴的處理邏輯
 * 
 * @author system
 * @since 2025-01-XX
 */
@Slf4j
@Component
public class RedisKeyExpirationHandler {

    /**
     * 存儲不同key前綴對應的處理器
     * key: key前綴（如 "order:pay:"）
     * value: 處理邏輯
     */
    private final Map<String, Consumer<String>> handlers = new ConcurrentHashMap<>();

    /**
     * 處理過期的key
     * 
     * @param expiredKey 過期的key
     */
    public void handleExpiration(String expiredKey) {
        log.info("開始處理過期Key: {}", expiredKey);
        
        // 遍歷所有註冊的處理器，找到匹配的前綴
        for (Map.Entry<String, Consumer<String>> entry : handlers.entrySet()) {
            String prefix = entry.getKey();
            if (expiredKey.startsWith(prefix)) {
                try {
                    log.info("找到匹配的處理器，前綴: {}, key: {}", prefix, expiredKey);
                    entry.getValue().accept(expiredKey);
                } catch (Exception e) {
                    log.error("執行過期處理邏輯失敗，前綴: {}, key: {}", prefix, expiredKey, e);
                }
                return;
            }
        }
        
        log.warn("未找到匹配的處理器，key: {}", expiredKey);
    }

    /**
     * 註冊key過期處理器
     * 
     * @param keyPrefix key前綴（如 "order:pay:"）
     * @param handler 處理邏輯
     */
    public void registerHandler(String keyPrefix, Consumer<String> handler) {
        if (keyPrefix == null || keyPrefix.isEmpty()) {
            throw new IllegalArgumentException("key前綴不能為空");
        }
        if (handler == null) {
            throw new IllegalArgumentException("處理器不能為null");
        }
        
        handlers.put(keyPrefix, handler);
        log.info("註冊Redis Key過期處理器，前綴: {}", keyPrefix);
    }

    /**
     * 移除key過期處理器
     * 
     * @param keyPrefix key前綴
     */
    public void unregisterHandler(String keyPrefix) {
        handlers.remove(keyPrefix);
        log.info("移除Redis Key過期處理器，前綴: {}", keyPrefix);
    }

    /**
     * 獲取所有已註冊的前綴
     * 
     * @return 前綴集合
     */
    public java.util.Set<String> getRegisteredPrefixes() {
        return handlers.keySet();
    }
}

