require 'sqreen/ecosystem/module_api'
require 'sqreen/ecosystem/module_api/instrumentation'
require 'sqreen/ecosystem/module_api/tracing_push_down'
require 'sqreen/ecosystem/module_api/signal_producer'
require 'sqreen/ecosystem/module_api/transaction_storage'
require 'sqreen/ecosystem/tracing/signals/tracing_client'

module Sqreen
  module Ecosystem
    module Http
      class NetHttp
        include ModuleApi::Instrumentation
        include ModuleApi::SignalProducer
        include ModuleApi::TracingPushDown

        def setup
          instrument 'Net::HTTP#request', before: method(:before_advice)
        end

        private

        # instr. def request(req, body = nil, &block)  # :yield: +response+
        # req is of type +Net::HTTPGenericRequest+
        def before_advice(call, _ball)
          return unless should_sample?('client')

          tracing_id = create_tracing_id

          # build & submit signal
          host = call.instance.address
          port = call.instance.port

          host += ':' + port.to_s if port != 80 && port != 443

          signal = Tracing::Signals::TracingClient.new
          signal.payload = Tracing::Signals::TracingClient::Payload.new(
            transport: 'http',
            host: host,
            tracing_identifier: tracing_id
          )

          submit_signal signal

          # add tracing header, if available
          req = call.args[0]
          req[ModuleApi::TRACE_ID_HEADER] = tracing_id
        end
      end
    end
  end
end