require "sup/index"

module Redwood
  # Provides label tweaking service to the user.
  # Working as the backend of ConsoleMode.
  #
  # Should become the backend of bin/sup-tweak-labels in the future.
  class LabelService
    # @param index [Redwood::Index]
    def initialize index=Index.instance
      @index = index
    end

    def add_labels query, *labels
      run_on_each_message(query) do |m|
        labels.each {|l| m.add_label l }
      end
    end

    def remove_labels query, *labels
      run_on_each_message(query) do |m|
        labels.each {|l| m.remove_label l }
      end
    end


    private
    def run_on_each_message query, &operation
      count = 0

      find_messages(query).each do |m|
        operation.call(m)
        @index.update_message_state m
        count += 1
      end

      @index.save_index
      count
    end

    def find_messages query
      @index.find_messages(query)
    end
  end
end