Rake::Task.clear Rake::Task.clear Rake::Task.clear

namespace :db do

namespace :mongoid do
  def tenancy_env
    ENV['TENANCY'] && !ENV['TENANCY'].empty? ? ENV['TENANCY'] : nil
  end

  def tenancy_models
    ::Mongoid.models.select { |k| k.include?(::Mongoid::Tenant) }
  end

  def non_tenancy_models
    ::Mongoid.models.reject { |k| k.include?(::Mongoid::Tenant) }
  end

  def puts_warning
    puts 'Not running tenants... Provide a tenancy model:'
    puts "`TENANCY=Model #{ARGV.join(' ')}`"
  end

  desc 'Create Mongoid indexes, tenant aware'
  task create_indexes: %i[environment load_models] do
    # Run once, for tables outside tenancy
    ::Mongoid::Tasks::Database.create_indexes(non_tenancy_models)
    if tenancy_env
      Object.const_get(tenancy_env).active_tenants.each do |t|
        puts "Tenant #{t}"
        t.tenancy!
        ::Mongoid::Tasks::Database.create_indexes(tenancy_models)
      end
    else
      puts_warning
    end
  end

  desc 'Remove Mongoid indexes, tenant aware'
  task remove_indexes: %i[environment load_models] do
    # Run once, for tables outside tenancy
    ::Mongoid::Tasks::Database.remove_indexes(non_tenancy_models)
    if tenancy_env
      Object.const_get(tenancy_env).active_tenants.each do |t|
        puts "Tenant #{t}"
        t.tenancy!
        ::Mongoid::Tasks::Database.remove_indexes(tenancy_models)
      end
    else
      puts_warning
    end
  end

  desc 'Removes undefined Mongoid indexes, tenant aware'
  task remove_undefined_indexes: %i[environment load_models] do
    # Run once, for tables outside tenancy
    ::Mongoid::Tasks::Database.remove_undefined_indexes(non_tenancy_models)
    if tenancy_env
      Object.const_get(tenancy_env).active_tenants.each do |t|
        puts "Tenant #{t}"
        t.tenancy!
        ::Mongoid::Tasks::Database.remove_undefined_indexes(tenancy_models)
      end
    end
  end
end

end