# frozen_string_literal: true

namespace :backup do

desc "Restore and database and :backup_dirs from the git :backup_repo, with the TAG given"
task restore: :get_config do
  pull_repo(tag)
  sh "rake db:restore #{@backup_path}/db.sql"
  @asset_folders.each do |folder|
    dest_folder = "#{Rails.root}/#{folder}"
    sh "mkdir -p #{dest_folder}" unless File.directory?(dest_folder)
    sh "cp -r #{@backup_path}/#{folder}/* #{dest_folder}"
  end
end

end

desc “Commits and tag the database dump and :backup_dirs into a git :backup_repo” task backup: [“db:backup”, :get_config] do

pull_repo

# Gather data
sh "mv #{@dump_file} #{@backup_path}"

@asset_folders.each do |folder|
  dest_folder = "#{@backup_path}/#{folder}"
  sh "mkdir -p #{dest_folder}" unless File.directory?(dest_folder)
  sh "cp  -Lr #{Rails.root}/#{folder}/* #{dest_folder}"
end

# Pushing data
comment = "#{@app_name} backup at #{Time.now.strftime "%F %R"}"
sh "git add --all && git commit -m '#{comment}'" do |ok, _res|
  if ok
    sh "git push origin master"
  else
    puts "Nothing change since last backup"
  end
end

# Tagging
tagname = if tag.blank?
            "#{@app_name}-#{Date.today.strftime "%Y%m%d"}"
          else
            tag
          end
sh "git tag -a #{tagname} -m '#{comment}' -f"
sh "git push origin #{tagname}"

end

task :get_config do

@environment = Rails.env

@app_name = Rails.application.class.parent_name.parameterize
tmp_dir = "#{Rails.root}/tmp"
@repo_path = "#{tmp_dir}/backup"
@backup_path = "#{@repo_path}/#{@app_name}"
@dump_file = "#{tmp_dir}/db.sql"
@git_repo = Rails.configuration.backup_repo
@asset_folders = Rails.configuration.backup_dirs

end

def tag

name = ARGV[1]
unless name.nil?
  task name.to_sym do
  end
end
name

end

def pull_repo(tag = “”)

if File.directory?(@repo_path)
  cd @repo_path.to_s
  sh "git pull origin master"
else
  sh "git clone #{@git_repo} #{@repo_path}"
  cd @repo_path.to_s
end
sh "git checkout tags/#{tag}" unless tag.blank?

end