namespace :resque do

desc 'Generate God configuration file'
task :conf => :environment do
  File.write(Resque::God.config.config_file, Resque::God.config.to_god)

  puts "God configuration file generated to #{Resque::God.config.config_file}"
end

desc 'Start God server and watch for Resque workers'
task :start => :conf do
  if god_running?
    puts `#{god} start resque`
  else
    puts `#{god} -c #{Resque::God.config.config_file} -P #{Resque::God.config.pid_file} -l #{Resque::God.config.log_file}`
  end
end

desc 'Restart Resque workers'
task :restart => :conf do
  if god_stopped?
    Rake::Task['resque:start'].invoke
  else
    puts `#{god} load #{Resque::God.config.config_file} stop && #{god} restart resque`
  end
end

desc 'Stop Resque workers'
task :stop do
  puts `#{god} stop resque`
end

desc 'Stop Resque workers and quit God'
task :terminate do
  puts `#{god} terminate`
end

desc 'Stop processing any new jobs'
task :pause do
  puts `#{god} signal resque USR2`
end

desc 'Resume jobs processing after pause'
task :resume do
  puts `#{god} signal resque CONT`
end

desc 'Shows Resque status'
task :status do
  puts `#{god} status resque`
end

private

def god
  `which god`.strip
end

def god_running?
  File.exists?(Resque::God.config.pid_file) && Process.kill(0, File.read(Resque::God.config.pid_file).to_i)
rescue Errno::ESRCH
  false
rescue Errno::EPERM
  true
end

def god_stopped?
  !god_running?
end

end