require ‘dm-migrations’

# module DataMapper # module Migrations

  # module SingletonMethods
  #   def repository_execute(method, repository_name)
  #     models = DataMapper::Model.descendants
  #     puts "model: #{models}"
  #     models = models.select { |m| m.default_repository_name == repository_name } if repository_name
  #     models.each do |model|
  #       puts "model: #{model}"
  #       model.send(method, model.default_repository_name)
  #     end
  #   end
  #
  # end

  # module Repository
  #   def create_model_storage(model)
  #     adapter = self.adapter
  #     puts "creating model #{model} with #{adapter}"
  #     if adapter.respond_to?(:create_model_storage)
  #       ret = adapter.create_model_storage(model)
  #       puts "success: #{ret}"
  #       DataMapper.logger.add(ActiveSupport::BufferedLogger::Severity::INFO, "creating model #{model} #{ret}")
  #     end
  #   end
  # end
#   module DataObjectsAdapter
#     def create_model_storage(model)
#       name = self.name
#       properties = model.properties_with_subclasses(name)
#
#       return false if storage_exists?(model.storage_name(name))
#       return false if properties.empty?
#
#       with_connection do |connection|
#         p connection
#         statements = [ create_table_statement(connection, model, properties) ]
#         statements.concat(create_index_statements(model))
#         statements.concat(create_unique_index_statements(model))
#
#         statements.each do |statement|
#           #puts "statement: #{statement}"
#           command = connection.create_command(statement)
#           command.execute_non_query
#         end
#       end
#
#       true
#     end
#   end
# end
#
# module Model
#   def auto_migrate!(repository_name = self.repository_name)
#     assert_valid(true)
#     auto_migrate_down!(repository_name)
#     auto_migrate_up!(repository_name)
#     puts "auto_migrate done"
#   end
#
#   def auto_migrate_up!(repository_name = self.repository_name)
#     assert_valid(true)
#     base_model = self.base_model
#     if base_model == self
#       puts "base_model == self"
#       repository(repository_name).create_model_storage(self)
#     else
#       puts "auto_migrate_up"
#       base_model.auto_migrate_up!(repository_name)
#     end
#   end
# end

# end

# Related to stackoverflow.com/q/5950238/1749924 namespace :test do

desc 'DataMapper prep stage: load the test database via desctructive autoupgrade'
task :prepare => :environment do
  #TODO make sure we're calling the correct DataMapper.setup....
  puts "if this is not test, then rails has already been booted incorrectly: #{Rails.env}"
  Rails.env = 'test'
  #Rake::Task['db:autoupgrade'].invoke
  # Copied from dm-rails/railties/database.rake, but needs to use the current test environment

  # puts '----'
  # p ::DataMapper::Model.descendants.entries
  # puts '^^^^'
  ::DataMapper.finalize
  Rails::DataMapper.configuration.repositories[Rails.env].each do |repository, config|
    #p DataMapper.repository.adapter
    ::DataMapper.auto_migrate!(repository.to_sym)
    puts "[datamapper] Finished update for :#{repository} repository '#{config['database']}'"
  end
end

end