class Search

  class GroupedSearchResults
    attr_reader :topic_count, :type_filter

    def initialize(type_filter)
      @type_filter = type_filter
      @by_type = {}
      @topic_count = 0
    end

    def topic_ids
      topic_results = @by_type[:topic]
      return Set.new if topic_results.blank?
      return topic_results.results.map{|r| r.topic_id}
    end

    def as_json(options = nil)
      @by_type.values.map do |grouped_result|
        grouped_result.as_json
      end
    end

    def add_result(result)
      grouped_result = @by_type[result.type] || (@by_type[result.type] = SearchResultType.new(result.type))

      # Limit our results if there is no filter
      if @type_filter.present? or (grouped_result.size < Search.per_facet)
        @topic_count += 1 if (result.type == :topic)

        grouped_result.add(result)
      else
        grouped_result.more = true
      end
    end

  end

end
