namespace :load do

task :defaults do
  set :endless_pid, -> { File.join(shared_path, 'tmp', 'pids', 'endless.pid') }
  set :endless_role, :app
  set :endless_env, fetch(:run_mode, 'production')
  set :endless_binary, -> { fetch(:application) }
  set :endless_start_cmd, -> { "nohup #{current_path}/#{fetch(:endless_binary)} >/dev/null 2>>#{shared_path}/log/stderr.log &" }
  set :endless_safe_restart_signal, "HUP"
  set :endless_safe_stop_signal, "TERM"
end

end

namespace :endless do

desc "start Endless server"
task :start do
  on roles(fetch(:endless_role)) do
    within current_path do
      if (test "[ -f #{fetch(:endless_pid)} ]") && (test :kill, "-0 $( cat #{fetch(:endless_pid)} )")
        info 'Already Endless is running'
      else
        with run_mode: fetch(:endless_env) do
          execute "cd #{current_path} && #{fetch(:endless_start_cmd)}"
        end
      end
    end
  end
end

desc "kill endless immediately (no graceful) then start new endless"
task "harmful-restart" do
  on roles(fetch(:endless_role)) do
    within current_path do
      if (test "[ -f #{fetch(:endless_pid)} ]") && (test :kill, "-0 $( cat #{fetch(:endless_pid)} )")
        execute "cat #{fetch(:endless_pid)} | xargs kill -s KILL"
        invoke("endless:start")
      else
        invoke("endless:start")
      end
    end
  end
end

desc "graceful restart endless"
task "safe-restart" do
  on roles(fetch(:endless_role)) do
    within current_path do
      if (test "[ -f #{fetch(:endless_pid)} ]") && (test :kill, "-0 $( cat #{fetch(:endless_pid)} )")
        execute "cat #{fetch(:endless_pid)} | xargs kill -s #{fetch(:endless_safe_restart_signal)}"
      else
        invoke("endless:start")
      end
    end
  end
end

desc "graceful shutdown endless"
task "safe-stop" do
  on roles(fetch(:endless_role)) do
    within current_path do
      if (test "[ -f #{fetch(:endless_pid)} ]") && (test :kill, "-0 $( cat #{fetch(:endless_pid)} )")
        info "Already Endless is stopped"
      else
        execute "cat #{fetch(:endless_pid)} | xargs kill -s #{fetch(:endless_safe_stop_signal)}"
      end
    end
  end
end

end