namespace :load do

task :defaults do
  set :sidekiq_monit_conf_dir, '/etc/monit/conf.d'
  set :sidekiq_monit_conf_file, "sidekiq-#{fetch(:stage)}.conf"
  set :sidekiq_monit_use_sudo, true
  set :monit_bin, '/usr/bin/monit'
  set :sidekiq_monit_default_hooks, true
  set :sidekiq_monit_group, nil
end

end

namespace :deploy do

before :starting, :check_sidekiq_monit_hooks do
  if fetch(:sidekiq_default_hooks) && fetch(:sidekiq_monit_default_hooks)
    invoke 'sidekiq:monit:add_default_hooks'
  end
end

end

namespace :sidekiq do

namespace :monit do
  task :add_default_hooks do
    before 'deploy:updating',  'sidekiq:monit:unmonitor'
    after  'deploy:published', 'sidekiq:monit:monitor'
  end

  desc 'Stop Sidekiq monit-service'
  task :stop do
    on roles(fetch(:sidekiq_roles)) do
      sidekiq_options_per_process.each_index do |index|
        sudo_if_needed "#{fetch(:monit_bin)} stop #{service_unit_name(index)}"
      end
    end
  end

  desc 'Start Sidekiq monit-service'
  task :start do
    on roles(fetch(:sidekiq_roles)) do
      sidekiq_options_per_process.each_index do |index|
        sudo_if_needed "#{fetch(:monit_bin)} start #{service_unit_name(index)}"
      end
    end
  end

  desc 'Restart Sidekiq monit-service'
  task :restart do
    on roles(fetch(:sidekiq_roles)) do
      sidekiq_options_per_process.each_index do |index|
        sudo_if_needed"#{fetch(:monit_bin)} restart #{service_unit_name(index)}"
      end
    end
  end

  desc 'Unmonitor Sidekiq monit-service'
  task :unmonitor do
    on roles(fetch(:sidekiq_roles)) do
      sidekiq_options_per_process.each_index do |index|
        begin
          sudo_if_needed "#{fetch(:monit_bin)} unmonitor #{service_unit_name(index)}"
        rescue
          # no worries here
        end
      end
    end
  end

  desc 'Monitor Sidekiq monit-service'
  task :monitor do
    on roles(fetch(:sidekiq_roles)) do
      sidekiq_options_per_process.each_index do |index|
        begin
          sudo_if_needed "#{fetch(:monit_bin)} monitor #{service_unit_name(index)}"
        rescue
          invoke 'sidekiq:monit:install'
          sudo_if_needed "#{fetch(:monit_bin)} monitor #{service_unit_name(index)}"
        end
      end
    end
  end

  desc 'Install Sidekiq monit-service'
  task :install do
    on roles(fetch(:sidekiq_roles)) do |role|
      template = File.read(File.expand_path('../../../../generators/capistrano/sidekiq/monit/templates/sidekiq.conf.capistrano.erb', __FILE__))
      upload!(StringIO.new(ERB.new(template).result(binding)), "#{fetch(:tmp_dir)}/monit.conf")
      sudo_if_needed "mv #{fetch(:tmp_dir)}/monit.conf #{fetch(:sidekiq_monit_conf_dir)}/#{fetch(:sidekiq_monit_conf_file)}"
      sudo_if_needed "#{fetch(:monit_bin)} reload"
    end
  end

  desc 'Uninstall Sidekiq monit-service'
  task :uninstall do
    on roles(fetch(:sidekiq_roles)) do |role|
      sudo_if_needed "rm #{fetch(:sidekiq_monit_conf_dir)}/#{fetch(:sidekiq_monit_conf_file)}"
      sudo_if_needed "#{fetch(:monit_bin)} reload"
    end
  end

  def sudo_if_needed(command)
    send(use_sudo? ? :sudo : :execute, command)
  end

  def use_sudo?
    fetch(:sidekiq_monit_use_sudo)
  end
end

end