module JSONAPI::Instrumentation

def self.build_relationship_payload(resource_type, resource_id, relationship_name, related_type, related_ids)

def self.build_relationship_payload(resource_type, resource_id, relationship_name, related_type, related_ids)
  { resource_type:, resource_id:, relationship_name: }.tap do |p|
    p[:related_type] = related_type if related_type
    p[:related_ids] = Array(related_ids) if related_ids
  end
end

def self.enabled?

def self.enabled?
  defined?(Rails) && Rails.respond_to?(:event) && Rails.event.respond_to?(:notify)
end

def self.notify_relationship(action, resource_type, payload)

def self.notify_relationship(action, resource_type, payload)
  Rails.event.tagged("jsonapi", "relationship") do
    Rails.event.notify("jsonapi.#{resource_type}.relationship.#{action}", payload)
  end
end

def self.relationship_event(action:, resource_type:, resource_id:, relationship_name:, related_ids: nil,

def self.relationship_event(action:, resource_type:, resource_id:, relationship_name:, related_ids: nil,
                            related_type: nil)
  return unless enabled?
  payload = build_relationship_payload(resource_type, resource_id, relationship_name, related_type, related_ids)
  notify_relationship(action, resource_type, payload)
end

def self.resource_event(action:, resource_type:, resource_id:, changes: {})

def self.resource_event(action:, resource_type:, resource_id:, changes: {})
  return unless enabled?
  Rails.event.tagged("jsonapi") do
    Rails.event.notify(
      "jsonapi.#{resource_type}.#{action}",
      resource_type:,
      resource_id:,
      changes: changes.compact,
    )
  end
end