interface CacheEntry<T> {
  data: T;
  expiresAt: number;
}

/** In-memory TTL cache — ลด query DB ซ้ำ */
export function createMemoryCache<T>(defaultTtlMs: number) {
  const store = new Map<string, CacheEntry<T>>();

  return {
    get(key: string): T | undefined {
      const entry = store.get(key);
      if (!entry) return undefined;
      if (Date.now() > entry.expiresAt) return undefined;
      return entry.data;
    },

    /** คืนค่าแม้หมดอายุ — ใช้ตอน DB ช้าเพื่อไม่ให้ request ค้าง */
    getStale(key: string): T | undefined {
      return store.get(key)?.data;
    },

    isFresh(key: string): boolean {
      const entry = store.get(key);
      return !!entry && Date.now() <= entry.expiresAt;
    },

    set(key: string, data: T, ttlMs: number = defaultTtlMs): void {
      store.set(key, { data, expiresAt: Date.now() + ttlMs });
    },

    delete(key: string): void {
      store.delete(key);
    },

    deletePrefix(prefix: string): void {
      for (const key of store.keys()) {
        if (key.startsWith(prefix)) store.delete(key);
      }
    },
  };
}
