class Idempo::MemoryBackend
  def initialize
    require_relative "response_store"
    @lock = Idempo::MemoryLock.new
    @response_store = Idempo::ResponseStore.new
    @store_mutex = Mutex.new
  end

  class Store < Struct.new(:store_mutex, :response_store, :key, keyword_init: true)
    def lookup
      store_mutex.synchronize do
        response_store.lookup(key)
      end
    end

    def store(data:, ttl:)
      store_mutex.synchronize do
        response_store.save(key, data, ttl)
      end
    end
  end

  def with_idempotency_key(request_key)
    @lock.with(request_key) do
      store = Store.new(store_mutex: @store_mutex, response_store: @response_store, key: request_key)
      yield(store)
    end
  end

  def prune!
    @response_store.prune
  end
end