/**
 * 简单 LRU 缓存（对齐 02-architecture-design.md §3.1 降级策略）。
 *
 * 当 Redis 不可用时，降级为内存 LRU 缓存。
 * 不持久化、不跨进程共享，仅作 Redis 故障时的兜底。
 *
 * 实现：Map 保持插入顺序，访问时删除重插实现 LRU 语义。
 */

export class LruCache {
  private readonly store = new Map<
    string,
    { value: string; expiresAt: number }
  >();
  private readonly maxSize: number;

  constructor(maxSize = 100) {
    this.maxSize = maxSize;
  }

  get(key: string): string | null {
    const entry = this.store.get(key);
    if (!entry) return null;
    if (Date.now() > entry.expiresAt) {
      this.store.delete(key);
      return null;
    }
    // LRU: 删除重插，移到末尾（最近使用）
    this.store.delete(key);
    this.store.set(key, entry);
    return entry.value;
  }

  set(key: string, value: string, ttlSeconds: number): void {
    // 容量满时淘汰最老条目（Map 迭代顺序为插入顺序）
    if (this.store.size >= this.maxSize) {
      const oldestKey = this.store.keys().next().value;
      if (oldestKey !== undefined) {
        this.store.delete(oldestKey);
      }
    }
    this.store.set(key, {
      value,
      expiresAt: Date.now() + ttlSeconds * 1000,
    });
  }

  delete(key: string): void {
    this.store.delete(key);
  }

  clear(): void {
    this.store.clear();
  }

  get size(): number {
    return this.store.size;
  }
}
