package dev.elaine.redislab.observe;

import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.LongAdder;

public final class HotKeyDetector {
  private final Map<String, LongAdder> counts = new ConcurrentHashMap<>();

  public void record(String key) {
    counts.computeIfAbsent(key, ignored -> new LongAdder()).increment();
  }

  public List<KeyCount> top(int limit) {
    return counts.entrySet().stream()
        .map(entry -> new KeyCount(entry.getKey(), entry.getValue().sum()))
        .sorted(Comparator.comparingLong(KeyCount::count).reversed())
        .limit(limit)
        .toList();
  }

  public record KeyCount(String key, long count) {}
}
