class JSONAPI::Support::ProsopiteInstrumentationLogger

def build_payload(env, n1_details)

def build_payload(env, n1_details)
  base = { n1_details: n1_details, n1_query: extract_first_query(n1_details) }
  result = if env.nil?
             base
           else
             request_payload(ActionDispatch::Request.new(env), n1_details).merge(n1_query: base[:n1_query])
           end
  result.merge(correlation_id: JSONAPI::Support::CorrelationId.resolve)
end

def extract_first_query(n1_details)

def extract_first_query(n1_details)
  return nil if n1_details.nil? || n1_details.empty?
  parts = n1_details.split("Call stack:")
  return nil if parts.size < 2
  query_section = parts[0].sub(/\AN\+1 queries detected:\n?/, "")
  first_line = query_section.each_line.map(&:strip).reject(&:empty?).first
  first_line.presence
end

def request_payload(req, n1_details)

def request_payload(req, n1_details)
  params = req.params
  {
    path: req.path,
    method: req.request_method,
    include: params[:include],
    resource_type: params[:resource_type],
    resource_id: params[:id],
    n1_details: n1_details,
  }
end

def warn(progname = nil, &)

def warn(progname = nil, &)
  n1_details = block_given? ? yield : progname.to_s
  return if n1_details.nil? || n1_details.empty?
  env = Thread.current[:jpie_request_env]
  payload = build_payload(env, n1_details)
  return unless defined?(Rails) && Rails.respond_to?(:event)
  Rails.event.tagged("jsonapi", "n1") do
    Rails.event.notify("jpie.n1_detected", payload)
  end
end