namespace :ds do

task configure: :environment do
  datastax_config = ERB.new(Rails.root.join('config', 'datastax.yml').read).result(binding)
  @configs = YAML.load(datastax_config)
  @config = @configs[Rails.env || 'development']
  @migrator = DatastaxRails::Schema::Migrator.new(@config['keyspace'])
end

desc 'Create the keyspace in config/datastax.yml for the current environment'
task :create do
  datastax_config = ERB.new(Rails.root.join('config', 'datastax.yml').read).result(binding)
  @configs = YAML.load(datastax_config)
  @config = @configs[Rails.env || 'development']
  DatastaxRails::Base.establish_connection(@config.with_indifferent_access.merge(keyspace: 'system'))
  DatastaxRails::Schema::Migrator.new('system').create_keyspace(@config['keyspace'], @config)
end

desc 'Drop keyspace in config/datastax.yml for the current environment'
task drop: :configure do
  @migrator.drop_keyspace
end

desc 'Migrate keyspace to latest version -- pass in model name ' \
     'to force an upload of just that one (all force-uploads everything).'
task :migrate, [:force_cf] => :configure do |_t, args|
  if args[:force_cf].blank?
    @migrator.migrate_all
  else
    args[:force_cf] == 'all' ? @migrator.migrate_all(true) : @migrator.migrate_one(args[:force_cf].constantize, true)
  end
end

desc 'Alias for ds:migrate to maintain backwards-compatibility'
task :schema, [:force_cf] => :migrate

desc 'Rebuild SOLR Index -- pass in a model name (all rebuilds everything)'
task :reindex, [:model] => :configure do |_t, args|
  if args[:model].blank?
    puts "\nUSAGE: rake ds:reindex[Model]"
  elsif args[:model] == 'all'
    @migrator.reindex_all
  else
    @migrator.reindex_one(args[:model].constantize)
  end
end

desc 'Create SOLR Core (Normally not needed) -- pass in a model name (all creates everything)'
task :create_core, [:model] => :configure do |_t, args|
  if args[:model].blank?
    puts "\nUSAGE: rake ds:create_core[Model]"
  else
    @migrator.create_solr_core(args[:model].constantize)
  end
end

desc 'Load the seed data from ks/seeds.rb'
task seed: :environment do
  seed_file = Rails.root.join('ks', 'seeds.rb')
  load(seed_file) if seed_file.exist?
end

if defined?(ParallelTests)
  namespace :parallel do
    desc 'create test keyspaces via ds:create --> ds:parallel:create[num_cpus]'
    task :create, :count do |_t, args|
      ParallelTests::Tasks.run_in_parallel("rake ds:create RAILS_ENV=#{ParallelTests::Tasks.rails_env}", args)
    end

    desc 'drop test keyspaces via ds:drop --> ds:parallel:drop[num_cpus]'
    task :drop, :count do |_t, args|
      ParallelTests::Tasks.run_in_parallel("rake ds:drop RAILS_ENV=#{ParallelTests::Tasks.rails_env}", args)
    end

    desc 'update test keyspaces via ds:migrate --> ds:parallel:migrate[num_cpus]'
    task :migrate, :count do |_t, args|
      args = args.to_hash.merge(non_parallel: true)
      ParallelTests::Tasks.run_in_parallel("rake ds:migrate RAILS_ENV=#{ParallelTests::Tasks.rails_env}", args)
    end
  end
end

end