# frozen_string_literal: true

namespace :deploy do

before :starting, :check_sidekiq_hooks do
  invoke 'sidekiq:add_default_hooks' if fetch(:sidekiq_default_hooks)
end

end

namespace :sidekiq do

task :add_default_hooks do
  after 'deploy:starting', 'sidekiq:quiet' if Rake::Task.task_defined?('sidekiq:quiet')
  after 'deploy:updated', 'sidekiq:stop'
  after 'deploy:reverted', 'sidekiq:stop'
  after 'deploy:published', 'sidekiq:start'
  after 'deploy:published', 'sidekiq:mark_deploy' if fetch(:sidekiq_mark_deploy, false)
  after 'deploy:failed', 'sidekiq:restart'
end

desc 'Mark deployment in Sidekiq metrics'
task :mark_deploy do
  if fetch(:sidekiq_mark_deploy, false)
    on roles(fetch(:sidekiq_roles)) do
      within current_path do
        # Get deploy label - use custom label or git description
        deploy_label = fetch(:sidekiq_deploy_label) || begin
          capture(:git, 'log', '-1', '--format="%h %s"').strip
        rescue StandardError
          "#{fetch(:application)} #{fetch(:stage)} deploy"
        end

        info "Marking deployment in Sidekiq metrics: #{deploy_label}"

        # Create a Ruby script to mark the deployment
        mark_deploy_script = <<~RUBY
          require 'sidekiq/deploy'
          Sidekiq::Deploy.mark!(ARGV[0])
        RUBY

        # Execute the script with the deploy label
        execute :bundle, :exec, :ruby, '-e', mark_deploy_script, '--', deploy_label
      end
    end
  end
end

end