# All possible rails db tasks jacopretorius.net/2014/02/all-rails-db-rake-tasks-and-what-they-do.html

namespace :db do

task :preload, [:skip_adapter_validation] do |t, args|
  require 'uri'

  @url = Sequel::DbTasks.configuration.database_url
  uri = URI.parse(@url)

  unless args[:skip_adapter_validation]
    raise "DB adapter is not postgres" if uri.scheme != "postgres"
  end
end

###

# https://www.postgresql.org/docs/current/app-createdb.html
desc "Create database"
task create: :preload do
  env = { "DATABASE_URL" => @url }
  exec env, "postgressor", "createdb"
end

# https://www.postgresql.org/docs/current/app-dropdb.html
desc "Drop database"
task drop: :preload do
  env = { "DATABASE_URL" => @url }
  exec env, "postgressor", "dropdb"
end

###

# https://www.postgresql.org/docs/current/app-pgdump.html
desc "Dump (backup) database"
task dump: :preload do
  env = { "DATABASE_URL" => @url }
  exec env, "postgressor", "dumpdb"
end

# https://www.postgresql.org/docs/current/app-pgrestore.html
desc "Restore database from backup"
task :restore, [:restore_dump_file_path] do |t, args|
  raise "Restore dump file path is not provided" unless args.restore_dump_file_path
  Rake::Task["db:preload"].execute

  env = { "DATABASE_URL" => @url }
  command = ["postgressor", "restoredb", args.restore_dump_file_path]
  command << "--switch_to_superuser" if ENV["AS_SUPERUSER"] == "true"

  exec env, *command
end

###

# https://www.postgresql.org/docs/current/app-createuser.html
desc "Create database user" # superuser is optional
task create_user: :preload do
  env = { "DATABASE_URL" => @url }
  exec env, "postgressor", "createuser"
end

# https://www.postgresql.org/docs/current/app-dropuser.html
desc "Drop database user"
task drop_user: :preload do
  env = { "DATABASE_URL" => @url }
  exec env, "postgressor", "dropuser"
end

###

# https://github.com/jeremyevans/sequel/blob/master/doc/migration.rdoc#a-basic-migration
desc "Generate migration file"
task :gm, [:name] do |t, args|
  migrations_path = Sequel::DbTasks.configuration.migrations_path
  mkdir_p migrations_path

  time = Time.now.utc.strftime("%Y%m%d%H%M%S")
  filename = File.join(migrations_path, "#{time}_#{args.name}.rb")
  File.write(filename,
    <<~RUBY
      # #{filename}

      Sequel.migration do
        change do

        end
      end
    RUBY
  )

  puts "Created migration '#{filename}'"
end

# https://github.com/jeremyevans/sequel/blob/master/doc/migration.rdoc#running-migrations-from-a-rake-task
desc "Run migrations"
task :migrate, [:version] do |t, args|
  Rake::Task["db:preload"].execute(skip_adapter_validation: true)
  require 'sequel/core'
  require 'logger'

  Sequel.extension :migration
  version = args[:version].to_i if args[:version]

  Sequel.connect(@url, logger: Logger.new(STDOUT)) do |db|
    Sequel::Migrator.run(db, Sequel::DbTasks.configuration.migrations_path, target: version)
  end
end

# https://github.com/jeremyevans/sequel/blob/master/doc/migration.rdoc#dumping-the-current-schema-as-a-migration
desc "Print current database schema"
task :'schema:print' do
  Rake::Task["db:preload"].execute(skip_adapter_validation: true)
  exec "bundle", "exec", "sequel", "-d", @url
end

end