# frozen_string_literal: true

namespace :load do

task :defaults do
  set(
    :database_url,
    "postgres://postgres@#{fetch(:slug)}-db/#{fetch(:application)}"
  )
end

end

namespace :docker do

namespace :db do
  desc 'Attempt to start the database container'
  task :start do
    on primary(:db) do
      network_list = [fetch(:docker_network, nil)].compact.flatten
      networks = network_list.map do |network|
        ['--network', network]
      end.compact.flatten.join(' ')
      execute 'docker', 'run', '-d', '--restart', 'always',
              '--name', "#{fetch(:slug)}-db",
              fetch(:docker_db_options, nil),
              networks, fetch(:database_image), '||', 'true'
    end
  end

  task :stop do
    on roles(:db), in: :parallel do
      %w[stop rm].each do |command|
        execute 'docker', command, "#{fetch(:slug)}-db", '||', 'true'
      end
    end
  end

  task :terminate do
    invoke 'docker:db:stop'
    invoke 'docker:db:clean'
  end

  task :clean do
    on roles(:db), in: :parallel do
      execute 'docker', 'rmi', fetch(:database_image), '||', 'true'
    end
  end

  task :setup do
    invoke 'docker:db:migrate'
    invoke 'docker:db:reset'
  end

  task :migrate do
    on roles(:app, select: :primary, migrate_on_deploy: true) do
      execute 'docker', 'exec', fetch(:slug), 'bin/rails',
              'db:migrate', "RAILS_ENV=#{fetch(:stage)}"
    end
  end

  task :reset do
    on roles(:app, select: :primary, reset_on_deploy: true) do
      execute 'docker', 'exec', fetch(:slug), 'bin/rails',
              'db:reset', "RAILS_ENV=#{fetch(:stage)}"
    end
  end
end

end