# frozen_string_literal: true

namespace :backup do

desc "Restore data from git repo, last backup by default"
task :restore, :tag do |_task, args|
  on roles(:app) do
    within release_path do
      with rails_env: fetch(:stage) do
        execute :rake, "backup:restore #{args[:tag]}"
      end
    end
  end
end

end

desc “Backup data to a git repo, tagging it into the git repo” task :backup, :tag do |_task, args|

on roles(:app) do
  within release_path do
    with rails_env: "production" do
      execute :rake, "backup #{args[:tag]}"
    end
  end
end

end

namespace :pull do

desc "Pull data (db/files) from remote (i.e: production) application."
task :data do
  invoke "pull:files"
  invoke "pull:db"
end

desc "Pull db: Hot backup, download and restore of the stage database"
task :db do
  on roles(:app) do
    within release_path do
      with rails_env: fetch(:stage) do
        execute :rake, "db:backup"
        execute "mv #{release_path}/tmp/db.sql /tmp/db.sql"
        download! "/tmp/db.sql", "tmp/db.sql"
      end
      run_locally do
        # Don't raise error if rails version < 5
        begin
          execute "rails db:environment:set RAILS_ENV=development"
        rescue StandardError; end
        rake "db:restore"
      end
    end
  end
end

desc "Pull files uploaded"
task :files do
  on roles(:app) do |host|
    run_locally do
      debug ":   Pulling Files from #{fetch(:stage)} ..."
      if fetch(:backup_dirs).any?
        fetch(:backup_dirs).each do |dir|
          execute "rm -r #{dir}"
          execute "scp -r -P #{host.port} #{host.user}@#{host.hostname}:#{current_path}/#{dir} #{dir}"
        end
      else
        error ":    Set key :backup_dirs to know which ones to pull"
      end
    end
  end
end

end