require 'mysql2' require 'yaml' require 'zlib' require 'global_shared_db'

namespace :global_shared_db do

desc "create database"
task :create do
  Rake::Task['environment'].invoke rescue nil
  puts "Create #{GlobalSharedDb::TaskHelper.current_db}"
  ActiveRecord::Tasks::DatabaseTasks.create(GlobalSharedDb.db_config)
end

desc "migrate database"
task :migrate => :environment do
  GlobalSharedDb::TaskHelper.connect_shared_db
  puts "Migrate #{GlobalSharedDb::TaskHelper.current_db}"

  migrate!
end

desc "roolback database"
task :rollback => :environment do
  GlobalSharedDb::TaskHelper.connect_shared_db
  puts "Rollback #{GlobalSharedDb::TaskHelper.current_db}"
  ActiveRecord::Migrator.rollback(GlobalSharedDb::TaskHelper::MIGRATE_PATH)
end

desc "migrate cms tables"
task :migrate_cms_tables => :environment do
  GlobalSharedDb::TaskHelper.connect_shared_db
end

desc 'shared db schema dump'
task :schema_dump => :environment do
  GlobalSharedDb::TaskHelper.connect_shared_db
  require 'active_record/schema_dumper'
  File.open('./db/global_shared_db_schema.rb', 'w:utf-8') do |file|
    ActiveRecord::SchemaDumper.dump(GlobalSharedDb::BaseDb.connection, file)
  end
end

if GlobalSharedDb.env != 'production'
  desc "delete database"
  task :drop => :environment do
    GlobalSharedDb::TaskHelper.connect_shared_db
    puts "Drop #{GlobalSharedDb::TaskHelper.current_db}"
    ActiveRecord::Tasks::DatabaseTasks.drop(
      GlobalSharedDb::BaseDb.connection_pool.spec.config.stringify_keys
    )
  end
end

desc 'shared db schema load'
task :schema_load => :environment do
  file = './db/global_shared_db_schema.rb'
  put "can not execute this task in production!!!" if GlobalSharedDb.env == 'production'

  if GlobalSharedDb.env != 'production' && File.exist?(file)
    ActiveRecord::Tasks::DatabaseTasks.load_schema_for(GlobalSharedDb.db_config, :ruby, file)
  end
end

desc 'migration status'
task :migration_status => :environment do
  GlobalSharedDb::TaskHelper.connect_shared_db
  ActiveRecord::Migrator.migrations_path = GlobalSharedDb::TaskHelper::MIGRATE_PATH

  Rake::Task['db:migrate:status'].invoke
end

desc 'current migration verson'
task :db_verson => :environment do
  GlobalSharedDb::TaskHelper.connect_shared_db

  Rake::Task['db:version'].invoke
end

def migrate!
  if ar_below_520?
    ActiveRecord::Migrator.migrate(GlobalSharedDb::TaskHelper::MIGRATE_PATH)
  else
    ActiveRecord::MigrationContext.new(GlobalSharedDb::TaskHelper::MIGRATE_PATH).migrate
  end
end

def ar_below_520?
  ActiveRecord.gem_version < Gem::Version.new("5.2.0")
end

end