module Buffer
  class Encode
    class << self
      def encode(arg)
        raise_error_for_incorrect_input(arg)
        arg = arg[:schedules] if arg.respond_to?(:keys)
        arg.map.with_index do |item, index|
          process_schedule(item, index)
        end.join("&")
      end

      private

      def raise_error_for_incorrect_input(arg)
        unless arg.kind_of?(Hash) || arg.kind_of?(Array)
          raise ArgumentError, "Input must be/inherit from Hash or Array"
        end
      end

      def process_schedule(item, index)
        pairs_for(item).map do |key, value|
          "schedules[#{index}][#{key}][]=#{value}"
        end.join("&")
      end

      def pairs_for(item)
        uri = Addressable::URI.new
        uri.query_values = item
        uri.query.split("&").map {|p| p.split("=")}
      end
    end
  end
end