module JSONAPI::ActiveStorage::Detection

def attachment?(association_name, model_class)

def attachment?(association_name, model_class)
  return false unless defined?(::ActiveStorage)
  model_class.respond_to?(:reflect_on_attachment) &&
    model_class.reflect_on_attachment(association_name.to_sym).present?
end

def blob_type?(type)

def blob_type?(type)
  return false unless defined?(::ActiveStorage)
  type.to_s == "active_storage_blobs"
end

def filter_from_includes(includes_hash, current_model_class)

def filter_from_includes(includes_hash, current_model_class)
  return {} unless defined?(::ActiveStorage)
  includes_hash.each_with_object({}) do |(key, value), filtered|
    process_include_entry(key, value, current_model_class, filtered)
  end
end

def filter_include_value(value, association)

def filter_include_value(value, association)
  return value unless value.is_a?(Hash) && value.any?
  return value if association.polymorphic?
  nested_filtered = filter_from_includes(value, association.klass)
  nested_filtered.any? ? nested_filtered : nil
end

def filter_polymorphic_from_includes(includes_hash, current_model_class)

def filter_polymorphic_from_includes(includes_hash, current_model_class)
  includes_hash.each_with_object({}) do |(key, value), filtered|
    process_polymorphic_include(key, value, current_model_class, filtered)
  end
end

def process_include_entry(key, value, current_model_class, filtered)

def process_include_entry(key, value, current_model_class, filtered)
  return if current_model_class.reflect_on_attachment(key).present?
  association = current_model_class.reflect_on_association(key)
  return if association.nil?
  result = filter_include_value(value, association)
  filtered[key] = result unless result.nil?
end

def process_polymorphic_include(key, value, model_class, filtered)

def process_polymorphic_include(key, value, model_class, filtered)
  association = model_class.reflect_on_association(key)
  return unless association && !association.polymorphic?
  result = resolve_polymorphic_value(value, association)
  filtered[key] = result if result
end

def resolve_polymorphic_value(value, association)

def resolve_polymorphic_value(value, association)
  return value unless value.is_a?(Hash) && value.any?
  nested = filter_polymorphic_from_includes(value, association.klass)
  nested.any? ? nested : nil
end