require 'dm-rails/setup'
require 'dm-rails/storage'

def migration_paths
  Rails.configuration.paths['db/migrate'].map {|path| path+"/*.rb"}
end

namespace :db do

  desc 'Create the database, load the schema, and initialize with the seed data'
  task :setup => [ 'db:create', 'db:automigrate', 'db:seed' ]

  namespace :create do
    desc 'Create all the local databases defined in config/database.yml'
    task :all => :environment do
      Rails::DataMapper.storage.create_all
    end
  end

  desc "Create all local databases defined for the current Rails.env"
  task :create => :environment do
    Rails::DataMapper.storage.create_environment(Rails::DataMapper.configuration.repositories[Rails.env])
  end

  namespace :drop do
    desc 'Drop all the local databases defined in config/database.yml'
    task :all => :environment do
      Rails::DataMapper.storage.drop_all
    end
  end

  desc "Drop all local databases defined for the current Rails.env"
  task :drop => :environment do
    Rails::DataMapper.storage.drop_environment(Rails::DataMapper.configuration.repositories[Rails.env])
  end


  desc 'Perform destructive automigration of all repositories in the current Rails.env'
  task :automigrate => :environment do
    require 'dm-migrations'
    Rails::DataMapper.configuration.repositories[Rails.env].each do |repository, config|
      ::DataMapper.auto_migrate!(repository.to_sym)
      puts "[datamapper] Finished auto_migrate! for :#{repository} repository '#{config['database']}'"
    end
  end

  desc 'Perform non destructive automigration of all repositories in the current Rails.env'
  task :autoupgrade => :environment do
    require 'dm-migrations'
    Rails::DataMapper.configuration.repositories[Rails.env].each do |repository, config|
      ::DataMapper.auto_upgrade!(repository.to_sym)
      puts "[datamapper] Finished auto_upgrade! for :#{repository} repository '#{config['database']}'"
    end
  end

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

  namespace :migrate do
    task :load => :environment do
      require 'dm-migrations/migration_runner'

      FileList[migration_paths].each do |migration|
        load migration
      end
    end

    desc 'Migrate up using migrations'
    task :up, [:version] => [:load] do |t, args|
      ::DataMapper::MigrationRunner.migrate_up!(args[:version])
    end

    desc 'Migrate down using migrations'
    task :down, [:version] => [:load] do |t, args|
      ::DataMapper::MigrationRunner.migrate_down!(args[:version])
    end
  end

  desc 'Migrate the database to the latest version'
  task :migrate do
    migrate_task = if migration_paths.all? { |path| Dir[path].empty? }
                     'db:autoupgrade'
                   else
                     'db:migrate:up'
                   end

    Rake::Task[migrate_task].invoke
  end

  namespace :sessions do
    desc "Creates the sessions table for DataMapperStore"
    task :create => :environment do
      require 'dm-rails/session_store'
      Rails::DataMapper::SessionStore::Session.auto_migrate!
      database = Rails::DataMapper.configuration.repositories[Rails.env]['database']
      puts "Created '#{database}.sessions'"
    end

    desc "Clear the sessions table for DataMapperStore"
    task :clear => :environment do
      require 'dm-rails/session_store'
      Rails::DataMapper::SessionStore::Session.destroy!
      database = Rails::DataMapper.configuration.repositories[Rails.env]['database']
      puts "Deleted entries from '#{database}.sessions'"
    end
  end

end
