require ‘securerandom’

namespace :deploy do

namespace :check do
  task :linked_files => 'config/database.yml'
end

end

namespace :db do

desc 'Created the DB'
task :create do
  on primary fetch(:migration_role) do
    within release_path do
      with rails_env: fetch(:rails_env) do
        execute :rake, 'db:create'
      end
    end
  end
end

desc 'Create backup of the DB'
task :backup do
  on primary fetch(:migration_role) do
    within release_path do
      with rails_env: fetch(:rails_env) do
        execute :rake, 'db:backup'
        execute :rake, 'db:cleanup', "ROTATE=#{fetch(:keep_releases)}"
      end
    end
  end
end

desc 'Restore the latest dump of the DB'
task :restore do
  on primary fetch(:migration_role) do
    within release_path do
      with rails_env: fetch(:rails_env) do
        execute :rake, 'db:restore'
      end
    end
  end
end

desc 'Download to local machine the latest backup'
task :dump_download, :env_name do |task, args|
  on primary fetch(:migration_role) do
    within release_path do
      FileUtils.mkdir_p 'db/backups'
      env_name = args[:env_name] || fetch(:rails_env).to_s
      database_config_content = read_remote_database_config
      database_name = JCap::Recipes::Util.database_name(env_name, database_config_content)
      backup_file = "db/backups/#{database_name}_latest.dump"
      download! "#{release_path}/#{backup_file}", backup_file
    end
  end
end

desc 'Download to local machine the latest backup'
task :dump_upload, :env_name do |task, args|
  on primary fetch(:migration_role) do
    within release_path do
      FileUtils.mkdir_p 'db/backups'
      env_name = args[:env_name] || fetch(:rails_env).to_s
      database_config_content = read_remote_database_config
      database_name = JCap::Recipes::Util.database_name(env_name, database_config_content)
      backup_file = "db/backups/#{database_name}_latest.dump"
      upload! backup_file, "#{release_path}/#{backup_file}"
    end
  end
end

end

remote_file ‘config/database.yml’ => ‘/tmp/database.yml’, roles: :app after ‘config/database.yml’, :remove_db_tmp_file do

File.delete '/tmp/database.yml'

end

file ‘/tmp/database.yml’ do |t|

default_template = <<-EOF
    base: &base
      adapter: sqlite3
      timeout: 5000
    development:
      database: #{shared_path}/db/development.sqlite3
      <<: *base
    test:
      database: #{shared_path}/db/test.sqlite3
      <<: *base
    production:
      database: #{shared_path}/db/production.sqlite3
      <<: *base
EOF

location = fetch(:template_dir,  File.join(File.dirname(__FILE__), 'templates', 'database.yml.erb'))
template = File.file?(location) ? File.read(location) : default_template

config = ERB.new(template)
File.open t.name, 'w' do |f|
  f.puts config.result(binding)
end

end

def read_remote_database_config(path = ‘config/database.yml’)

capture :cat, path

end