$stdout.sync = true
include FileUtils

desc "Rebuild ferret index for all models, the number of records to load at a time can be specified with PER_PAGE=x, defaults to 1"
task :ferret_model_indexer => :environment do
  if !File.exist?(FerretMixin::Acts::ARFerret::index_dir)
    puts "Creating index dir in #{FerretMixin::Acts::ARFerret::index_dir}"
    FileUtils.mkdir_p(FerretMixin::Acts::ARFerret::index_dir)
  end

  classes = []
  Dir.glob(File.join(RAILS_ROOT,"app","models","*.rb")).each do |rbfile|
    bname = File.basename(rbfile,'.rb')
    klass = bname.camelize.constantize
    classes.push(klass)
  end
  classes.each do |c|
    if c.respond_to?(:ferret_index)
      c.ferret_index.query_delete(c.ferret_class_query) # remove existing ferret data for this class
      count = c.count
      next unless count > 0
      puts "Rebuilding #{c.name} ferret index"
      limit = ENV['PER_PAGE'] ? ENV['PER_PAGE'].to_i : 1
      1.step(count, limit) do |offset|
        models = c.find(:all, :limit => limit, :offset => offset, :order => "#{c.primary_key} ASC")
        models.each do |model|
          begin
            model.ferret_update
            print '.'
          rescue Object => e
            puts "\nError updating ferret index for #{c.name} #{id}."
            puts e.message
            puts e.backtrace.join("\n")
          end
        end
      end
      c.ferret_index.optimize
      puts "\nFinished rebuilding #{c.name} ferret index"
    end
  end
end
