module Sentry::Rails::ActiveJobExtensions

def self.included(base)

def self.included(base)
  base.class_eval do
    around_perform do |job, block|
      if Sentry.initialized?
        if already_supported_by_specific_integration?(job)
          block.call
        else
          Sentry.with_scope do |scope|
            capture_and_reraise_with_sentry(job, scope, block)
          end
        end
      else
        block.call
      end
    end
  end
end

def already_supported_by_specific_integration?(job)

def already_supported_by_specific_integration?(job)
  Sentry.configuration.rails.skippable_job_adapters.include?(job.class.queue_adapter.class.to_s)
end

def capture_and_reraise_with_sentry(job, scope, block)

def capture_and_reraise_with_sentry(job, scope, block)
  scope.set_transaction_name(job.class.name)
  transaction =
    if job.is_a?(::Sentry::SendEventJob)
      nil
    else
      Sentry.start_transaction(name: scope.transaction_name, op: "active_job")
    end
  scope.set_span(transaction) if transaction
  block.call
  finish_transaction(transaction, 200)
rescue Exception => e # rubocop:disable Lint/RescueException
  rescue_handler_result = rescue_with_handler(e)
  finish_transaction(transaction, 500)
  return rescue_handler_result if rescue_handler_result
  Sentry::Rails.capture_exception(
    e,
    extra: sentry_context(job),
    tags: {
      job_id: job.job_id,
      provider_job_id: job.provider_job_id
    }
  )
  raise e
end

def finish_transaction(transaction, status)

def finish_transaction(transaction, status)
  return unless transaction
  transaction.set_http_status(status)
  transaction.finish
end

def sentry_context(job)

def sentry_context(job)
  {
    active_job: job.class.name,
    arguments: job.arguments,
    scheduled_at: job.scheduled_at,
    job_id: job.job_id,
    provider_job_id: job.provider_job_id,
    locale: job.locale
  }
end