require “yaml” require “erb” require “dev_dump” include DevDump

namespace :dev_dump do

desc "dump the database to a zipped file"
task :dump => :environment do
  raise "gpg is required." unless `which gpg`
  raise "Ruby on Rails is required." unless defined?(Rails)
  raise "pg_dump is required." unless `which pg_dump`

  if db_config = DevDump.configuration.rails_db_config
    filename = "#{db_config['database']}.dump.#{Time.now.to_i}.sql"
    Dir.mkdir(DevDump.configuration.backups_path) unless File.exists?(DevDump.configuration.backups_path)
    file = "#{DevDump.configuration.backups_path}#{filename}"
    db_user = ERB.new(db_config['username']).result

    `pg_dump --clean --no-owner --no-privileges -U#{db_user} #{db_config['database']} | gzip > #{file}.gz`
    if File.exists?("#{file}.gz")
      `gpg -c #{file}.gz`
      `rm #{file}.gz`
      puts "wrote file: #{file}.gz.gpg"
    end
  end
end

desc "download dump file"
task :download_file, [:remote_path] do |t, args|
  if args && args[:remote_path]
    command = "scp #{DevDump.configuration.ssh_user}@#{DevDump.configuration.ssh_host}:#{args[:remote_path]} #{args[:remote_path]}"
    puts "downloading file with command: #{command}"
    `#{command}`
    puts "done."
  end
end

desc "load the database from a zipped file"
task :load, [:filepath] do |t, args|
  raise "gpg is required." unless `which gpg`
  raise "gunzip is required." unless `which gunzip`
  raise "psql is required." unless `which psql`

  file = if args.present? && File.exists?(args[:filepath])
    args[:filepath]
  else
    `ls -tr #{DevDump.configuration.backups_path} | tail -n1`.chomp
  end
  if file.empty?
    puts "no backups found"
  else
    puts "restoring from file: #{file}"
    if db_config = DevDump.configuration.rails_db_config
      db_user = ERB.new(db_config['username']).result
      gzipped_file = file.gsub(/\.gpg/, '')
      puts "gzipped file path: #{gzipped_file}"

      `gpg #{file}`
      if File.exists?(gzipped_file)
        `gunzip -c #{gzipped_file} | psql -U #{db_user} -d #{db_config['database']}`
      end
      puts "...done."
    end
  end
end

end