import { logger } from './logger.js'
import * as redis from './redis.js'

const cache = {}

export async function setAsync (key, asyncValue) {
  logger.trace(`[Cache] Set async ${key}`)
  cache[key] = asyncValue
  const value = await asyncValue
  await set(key, value)
  return value
}

export function set (key, value) {
  logger.trace(`[Cache] Set ${key}`)
  if (cache[key] === value) return
  cache[key] = value
  if (redis.isEnabled()) {
    return redis.client.set(key, value)
  }
}

export async function getBuffer (key) {
  return get(key, { method: 'getBuffer' })
}

export async function clear () {
  for (const prop of Object.getOwnPropertyNames(cache)) {
    delete cache[prop]
  }
}

export async function get (key, { method = 'get' } = {}) {
  if (cache[key]) {
    logger.trace(`[Cache] Resolve "${key}" from memory`)
    return cache[key]
  }

  if (redis.isEnabled()) {
    const result = await redis.client[method]?.(key)
    if (result) {
      logger.trace(`[Cache] Resolve "${key}" from redis`)
      cache[key] = result
    }
    return result
  }
}