# frozen_string_literal: true

# Copyright The OpenTelemetry Authors
#
# SPDX-License-Identifier: Apache-2.0

module OpenTelemetry
  module Instrumentation
    module Bunny
      module Patches
        # The Channel module contains the instrumentation patch the Channel#basic_get, Channel#basic_publish and Channel#handle_frameset methods
        module Channel
          def basic_get(queue, opts = { manual_ack: false })
            attributes = OpenTelemetry::Instrumentation::Bunny::PatchHelpers.basic_attributes(self, connection, '', nil)

            tracer.in_span("#{queue} receive", attributes: attributes, kind: :consumer) do |span, _ctx|
              delivery_info, properties, payload = super

              return [delivery_info, properties, payload] unless delivery_info

              OpenTelemetry::Instrumentation::Bunny::PatchHelpers.trace_enrich_receive_span(span, self, delivery_info, properties)

              [delivery_info, properties, payload]
            end
          end

          def basic_publish(payload, exchange, routing_key, opts = {})
            OpenTelemetry::Instrumentation::Bunny::PatchHelpers.with_send_span(self, tracer, exchange, routing_key) do
              OpenTelemetry::Instrumentation::Bunny::PatchHelpers.inject_context_into_property(opts, :headers)

              super(payload, exchange, routing_key, opts)
            end
          end

          # This method is called when rabbitmq pushes messages to subscribed consumers
          def handle_frameset(basic_deliver, properties, content)
            OpenTelemetry::Instrumentation::Bunny::PatchHelpers.trace_enrich_receive_span(OpenTelemetry::Trace.current_span, self, basic_deliver, properties) if basic_deliver

            super
          end

          private

          def tracer
            Bunny::Instrumentation.instance.tracer
          end
        end
      end
    end
  end
end
