require “pg_backup/helpers/database” include PgBackup::Helpers::Database

namespace :pg_backup do

namespace :dump do
  desc "Load dumped postgres backup file"
  task load: :environment do
    env_file_name = Rails.root.join(dump_dir, ENV.fetch("PG_DUMP_FILE")) if ENV.fetch("PG_DUMP_FILE", nil)
    file_name = env_file_name || Dir.glob("#{Rails.root}/#{dump_dir}/*.backup").sort.last
    raise "[pg_backup:dump:load] Can't find a dump file!" unless file_name
    say "[pg_backup:dump:load] Loading dump file from #{file_name}..."
    with_database_config do |host, db, user, pw|
      ` PGPASSWORD=#{pw} pg_restore --host #{host} --username #{user} --schema public --no-owner --no-acl --clean --dbname #{db} #{file_name} `
    end
    say "[pg_backup:dump:load] Done."
  end

  desc "Create dump from postgres db"
  task create: :environment do
    say "[pg_backup:dump:create] Creating dump file..."
    FileUtils.mkdir_p Rails.root.join(dump_dir)
    env_file_name = Rails.root.join(dump_dir, ENV.fetch("PG_DUMP_FILE")) if ENV.fetch("PG_DUMP_FILE", nil)
    file_name = env_file_name || Rails.root.join(dump_dir, "dump-#{Time.now.strftime('%Y%m%d%H%M%S')}.backup")
    with_database_config do |host, db, user, pw|
      ` PGPASSWORD=#{pw} pg_dump --host #{host} --username #{user} --clean --format=c --no-owner --no-acl #{db} > #{file_name} `
    end
    say "[pg_backup:dump:create] New dump file located at #{file_name}"
    say "[pg_backup:dump:create] Done."
  end

  def dump_dir
    ENV["PG_DUMP_DIR"] || "dump" # default to 'dump' folder as dump dir
  end

  def say(text)
    respond_to?(:info) ? info(text) : puts(text)
  end
end

end