require 'rake'

namespace :scrub do

  desc "scrub all"
  task all: :environment do

    require 'highline/import'
    require 'term/ansicolor'
    require 'logger'
    require 'parallel'

    @logger = Logger.new($stdout)

    unless ENV["SKIP_CONFIRM"] == "true"
      answer = ask("Type SCRUB to continue.".red)
      unless answer == "SCRUB"
        puts "exiting ...".red
        exit
      end
    end

    @logger.warn "Scrubbing classes".red

    Rails.application.eager_load! # make sure all the classes are loaded

    @total_scrubbed = 0

    ar_classes = ActiveRecord::Base.descendants.select{|d| d.scrubbable? }.sort_by{|d| d.to_s }
    Parallel.each(ar_classes) do |ar_class|

      # Removing any find or initialize callbacks from model
      ar_class.reset_callbacks(:initialize)
      ar_class.reset_callbacks(:find)

      @logger.info "Scrubbing #{ar_class} ...".green

      scrubbed_count = 0

      ActiveRecord::Base.connection_pool.with_connection do

        relation = ar_class.scoped
        relation = relation.send(:scrubbable_scope) if ar_class.respond_to?(:scrubbable_scope)

        relation.find_in_batches(batch_size: 1000) do |batch|
          ActiveRecord::Base.transaction do
            batch.each do |obj|
              obj.scrub!
              scrubbed_count += 1
            end
          end
        end
      end

      @logger.info "#{scrubbed_count} #{ar_class} objects scrubbed".blue
    end

    @logger.info "Running after hook".red
    ActsAsScrubbable.execute_after_hook

    @logger.info "Scrub Complete!".white
  end
end

desc "Links to scrub:all"
task :scrub => ['scrub:all']