/** Cache in-memory compartido para use_fetch. Singleton de modulo. */

interface CacheEntry {
  data: unknown
  timestamp: number
}

const cache = new Map<string, CacheEntry>()

/** Obtener dato del cache. Retorna null si no existe. */
export function cacheGet<T>(key: string): T | null {
  const entry = cache.get(key)
  return entry !== undefined ? (entry.data as T) : null
}

/** Guardar dato en el cache. */
export function cacheSet<T>(key: string, data: T): void {
  cache.set(key, { data, timestamp: Date.now() })
}

/** Verificar si existe una entrada en el cache. */
export function cacheHas(key: string): boolean {
  return cache.has(key)
}

/** Verificar si una entrada esta stale (supera staleTime en ms). */
export function cacheIsStale(key: string, staleTime: number): boolean {
  const entry = cache.get(key)
  if (!entry) return true
  return Date.now() - entry.timestamp > staleTime
}

/** Eliminar una entrada del cache. */
export function cacheDelete(key: string): void {
  cache.delete(key)
}

/** Eliminar todas las entradas cuya key empiece con prefix. */
export function cacheInvalidatePrefix(prefix: string): void {
  for (const key of cache.keys()) {
    if (key === prefix || key.startsWith(prefix + ':')) {
      cache.delete(key)
    }
  }
}

/** Vaciar el cache completo. */
export function cacheClear(): void {
  cache.clear()
}

/** Numero de entradas en cache. */
export function cacheSize(): number {
  return cache.size
}
