require "async"
require "async/barrier"
require "async/http/internet/instance"

module DTIRequests
	class << self
		def get(url, headers = [], &block)
			Async::HTTP::Internet.get(url, add_headers(headers), &block)
		end

		def post(url, headers = [], body = nil, &block)
			Async::HTTP::Internet.post(url, add_headers(headers), body, &block)
		end

		def load_many(max_at_once: 10)
			barrier = Async::Barrier.new
			semaphore = Async::Semaphore.new(max_at_once, parent: barrier)

			Sync do
				block_return_value = yield semaphore
				barrier.wait # Load all the subtasks.
				block_return_value
			ensure
				barrier.stop # If any subtasks failed, cancel the rest.
			end
		end

		private

		def add_headers(headers)
			if headers.none? { |(k, v)| k.downcase == "user-agent" }
				headers += [["User-Agent", Rails.configuration.user_agent_for_neopets]]
			end
			headers
		end
	end
end