namespace :foreman do

desc <<-DESC
  Export the Procfile to upstart.

  You can override any of these defaults by setting the variables shown below.

  set :foreman_cmd,          "foreman"
  set :foreman_format,       "upstart"
  set :foreman_location,     "/etc/init"
  set :foreman_port,         5000
  set :foreman_root,         -> { release_path }
  set :foreman_procfile,     -> { release_path.join('Procfile') }
  set :foreman_app,          -> { fetch(:application) }
  set :foreman_log,          -> { shared_path.join('log') }
  set :foreman_pids,         false
  set :foreman_concurrency,  false
  set :foreman_sudo,         false
  set :foreman_roles,        :all
  set :foreman_servers,      -> { release_roles(fetch(:foreman_roles)) }
DESC

task :export do
  on fetch(:foreman_servers) do |host|
    within release_path do
      foreman_cmd         = fetch(:foreman_cmd)
      foreman_concurrency = fetch(:foreman_concurrency)
      foreman_format      = fetch(:foreman_format)
      foreman_location    = fetch(:foreman_location)
      foreman_pids        = fetch(:foreman_pids)
      foreman_sudo        = fetch(:foreman_sudo)
      foreman_user        = fetch(:foreman_user, host.user)

      cmd = [foreman_cmd, 'export',  foreman_format, foreman_location]
      cmd << %Q(-f #{fetch(:foreman_procfile)})
      cmd << %Q(-p #{fetch(:foreman_port)})
      cmd << %Q(-d #{fetch(:foreman_root)})
      cmd << %Q(-a #{fetch(:foreman_app)})
      cmd << %Q(-u #{foreman_user})
      cmd << %Q(-l #{fetch(:foreman_log)})
      cmd << %Q(-r #{foreman_pids}) if foreman_pids
      cmd << %Q(-c #{foreman_concurrency}) if foreman_concurrency

      execute *cmd
    end
  end
end

desc 'Prefixes the foreman command with sudo when :foreman_sudo => true'
task :configure_sudo do
  if fetch(:foreman_sudo)
    foreman_cmd = fetch(:foreman_cmd).to_s
    SSHKit.config.command_map.prefix[foreman_cmd].push('sudo')
  end
end

end

Capistrano::DSL.stages.each do |stage|

after stage, 'foreman:configure_sudo'

end

namespace :load do

task :defaults do
  set :foreman_cmd,          "foreman"
  set :foreman_format,       "upstart"
  set :foreman_location,     "/etc/init"
  set :foreman_port,         5000
  set :foreman_root,         -> { release_path }
  set :foreman_procfile,     -> { release_path.join('Procfile') }
  set :foreman_app,          -> { fetch(:application) }
  set :foreman_log,          -> { shared_path.join('log') }
  set :foreman_pids,         false
  set :foreman_concurrency,  false
  set :foreman_sudo,         false
  set :foreman_roles,        :all
  set :foreman_servers,      -> { release_roles(fetch(:foreman_roles)) }
end

end

namespace :deploy do

after :updated, 'foreman:export'

end