git_plugin = self

namespace :deploy do

before :starting, :check_racecar_hooks do
  invoke 'racecar:add_hooks'
end

end

namespace :racecar do

def consumer_list
  YAML.parse_file(fetch(:racecar_task_path)).to_ruby['tasks']
end

def build_pid_file(consumer_name)
  "#{fetch(:racecar_pid_path)}/#{consumer_name.downcase}.pid"
end

task :add_hooks do
  after 'deploy:updated', 'racecar:stop'
  after 'deploy:published', 'racecar:start'
  after 'deploy:failed', 'racecar:restart'
end

desc 'Test'
task :test do
  on roles(fetch(:racecar_role)) do |role|
    within release_path do
      with rails_env: fetch(:rails_env) do
        info fetch(:racecar_pid_path)
        git_plugin.consumer_list.each { |item|
          git_plugin.build_pid_file(item)
        }
      end
    end
  end
end

desc 'Start'
task :start do
  on roles(fetch(:racecar_role)) do |role|
    within current_path do
      with rails_env: fetch(:rails_env) do
        git_plugin.consumer_list.each do |item|
          execute(:bundle, "exec racecar --daemonize #{item} --pidfile #{git_plugin.build_pid_file(item)}")
        end
      end
    end
  end
end

task :stop do
  on roles(fetch(:racecar_role)) do |role|
    within current_path do
      with rails_env: fetch(:rails_env) do
        git_plugin.consumer_list.each do |item|
          execute(:bundle, "exec racecarctl stop --pidfile #{git_plugin.build_pid_file(item)}")
        end
      end
    end
  end
end

task :restart do
  invoke! 'racecar:stop'
  invoke! 'racecar:start'
end

end