global

def retry_with_backoff(config: {})

def retry_with_backoff(config: {})
  retries = config[:runtime][:max_retries] || MAX_RETRIES

  begin
    yield
  rescue => e
    if retries > 0
      ActiveGenie::Logger.warn({ code: :retry_with_backoff, message: "Retrying request after error: #{e.message}. Attempts remaining: #{retries}" })

      retries -= 1
      backoff_time = calculate_backoff(MAX_RETRIES - retries)
      sleep(backoff_time)
      retry
    else
      raise
    end
  end
end