# frozen_string_literal: true

namespace :db do # rubocop:disable Metrics/BlockLength

desc 'Backs up the database.'
task backup: [:environment] do
  config = ActiveRecord::Base.connection_config

  backup_cmd = <<-BASH
    BACKUP_FOLDER=$HOME/database_backups/`date +%Y_%m_%d`
    BACKUP_NAME=unbounded_`date +%s`.dump
    BACKUP_PATH=$BACKUP_FOLDER/$BACKUP_NAME

    mkdir -p $BACKUP_FOLDER

    PGPASSWORD=#{config[:password]} pg_dump \
        -h #{config[:host] || 'localhost'} \
        -U #{config[:username]} \
        --no-owner \
        --no-acl \
        -n public \
        -F c \
        #{config[:database]} \
        > $BACKUP_PATH

    echo "-> Backup created in $BACKUP_PATH."
  BASH

  puts "Backing up #{Rails.env} database."

  raise unless system(backup_cmd)
end

desc 'Dumps the database.'
task dump: :environment do
  config = ActiveRecord::Base.connection_config

  dump_cmd = <<-BASH
    PGPASSWORD=#{config[:password]} \
    pg_dump \
      --port #{config[:port]} \
      --host #{config[:host]} \
      --username #{config[:username]} \
      --clean \
      --no-owner \
      --no-acl \
      --format=c \
      -n public \
      #{config[:database]} > #{Rails.root}/db/dump/content.dump
  BASH

  puts "Dumping #{Rails.env} database."

  raise unless system(dump_cmd)
end

desc 'Runs pg_restore.'
task pg_restore: [:environment] do
  config = ActiveRecord::Base.connection_config

  restore_cmd = <<-BASH
    PGPASSWORD=#{config[:password]} \
    pg_restore \
      --port=#{config[:port]} \
      --host=#{config[:host]} \
      --username=#{config[:username]} \
      --no-owner \
      --no-acl \
      -n public \
      --dbname=#{config[:database]} #{Rails.root}/db/dump/content.dump
  BASH

  puts "Restoring #{Rails.env} database."

  raise unless system(restore_cmd)
end

desc 'Drops, creates and restores the database from a dump.'
task restore: %i(drop create environment pg_restore)

end