namespace :deploy do

desc 'Lookup which service manager is used on each server'
task :lookup_server_service_manager do
  init_system_pid = 1

  on roles(:app) do |host|
    service_manager_name =
      capture "ps -p#{init_system_pid} co command | grep systemd || echo upstart"

    server(host).add_role(service_manager_name.to_sym)
  end
end

desc 'Export service script'
task export_service: %w[lookup_server_service_manager foreman:upload_procfile] do
  set :bundle_binstubs, -> { shared_path.join('bin') }

  on roles(:upstart) do
    within current_path do
      sudo fetch(:chruby_exec), "#{fetch(:chruby_ruby)} -- #{fetch(:bundle_binstubs)}/foreman export upstart /etc/init -a #{fetch(:application)} -u \`whoami\` -l #{shared_path}/log"
    end
  end

  on roles(:systemd) do
    load_state =
      capture "systemctl show #{fetch(:application)}.target -p LoadState --value"

    if load_state == "loaded"
      sudo :systemctl, "stop #{fetch(:application)}.target"
    end

    within current_path do
      sudo fetch(:chruby_exec), "#{fetch(:chruby_ruby)} -- #{fetch(:bundle_binstubs)}/foreman export systemd /etc/systemd/system -a #{fetch(:application)} -u \`whoami\` -l #{shared_path}/log"
    end

    sudo :systemctl, "daemon-reload"
  end
end

desc "Start application"
task start: :lookup_server_service_manager do
  invoke "deploy:export_service"

  on roles(:upstart) do
    sudo :start, fetch(:application)
  end

  on roles(:systemd) do
    sudo :systemctl, "start #{fetch(:application)}.target"
  end
end

desc "Restart application"
task restart: :lookup_server_service_manager do
  invoke "deploy:export_service"

  on roles(:upstart) do
    execute "sudo restart #{fetch(:application)} || sudo start #{fetch(:application)}"
  end

  on roles(:systemd) do
    application = fetch(:application)
    execute "sudo systemctl restart #{application}.target || sudo systemctl start #{application}.target"
  end
end

desc "Stop application"
task stop: :lookup_server_service_manager do
  on roles(:upstart) do
    sudo :stop, fetch(:application)
  end

  on roles(:systemd) do
    sudo :systemctl, "stop #{fetch(:application)}.target"
  end
end

task disable_autostart: :lookup_server_service_manager do
  on roles(:upstart) do
    execute "/bin/echo manual | sudo /usr/bin/tee /etc/init/#{fetch(:application)}.override"
  end

  on roles(:systemd) do
    sudo :systemctl, "disable #{fetch(:application)}.target"
  end
end

task enable_autostart: :lookup_server_service_manager do
  on roles(:upstart) do
    execute "/bin/echo | sudo /usr/bin/tee /etc/init/#{fetch(:application)}.override"
  end

  on roles(:systemd) do
    sudo :systemctl, "enable #{fetch(:application)}.target"
  end
end

namespace :foreman do
  desc 'Upload Procfile to server'
  task upload_procfile: :generate_procfile do
    on roles(:app) do |host|
      upload! "tmp/Procfile_#{host.hostname}", "#{fetch(:deploy_to)}/current/Procfile"
    end
  end

  desc 'Generate Procfile'
  task  :generate_procfile do
    Dir.mkdir('tmp') unless Dir.exist?('tmp')

    procfile_contents = fetch(:procfile_contents)

    on roles(:app) do |host|
      procfile_contents_string =
        if procfile_contents.is_a?(Hash)
          procfile_contents.fetch(host.hostname)
        else
          procfile_contents
        end

      File.open("tmp/Procfile_#{host.hostname}", 'w') do |conf|
        procfile_contents_string.each_line do |line|
          conf.puts "#{line.chomp} 2>&1 | logger -t #{fetch(:app_name)}"
        end
      end
    end
  end
end

end