# frozen_string_literal: true

class ::CustomWizard::Cache
  def initialize(key)
    @key = "#{CustomWizard::PLUGIN_NAME}_#{key}"
  end

  def read
    cache.read(@key)
  end

  def write(data)
    synchronize { cache.write(@key, data) }
  end

  def delete
    synchronize { cache.delete(@key) }
  end

  def synchronize
    DistributedMutex.synchronize(@key) { yield }
  end

  def cache
    @cache ||= Discourse.cache
  end

  def self.wrap(key, &block)
    c = new(key)

    if cached = c.read
      cached
    else
      result = block.call()
      c.write(result)
      result
    end
  end
end