module JSONAPI::ActiveStorageSupport

def active_storage_attachment?(association_name, model_class = nil)

def active_storage_attachment?(association_name, model_class = nil)
  resolved = model_class || resolve_model_class_for_attachment
  self.class.active_storage_attachment?(association_name, resolved)
end

def append_only_enabled?(attachment_name, resource_class)

def append_only_enabled?(attachment_name, resource_class)
  ActiveStorage::Deserialization.append_only_enabled?(attachment_name, resource_class)
end

def attach_active_storage_files(record, attachment_params, resource_class: nil)

def attach_active_storage_files(record, attachment_params, resource_class: nil)
  ActiveStorage::Deserialization.attach_files(record, attachment_params, definition: resource_class)
end

def extract_active_storage_params_from_hash(params_hash, model_class)

def extract_active_storage_params_from_hash(params_hash, model_class)
  ActiveStorage::Deserialization.extract_params_from_hash(params_hash, model_class)
end

def filter_active_storage_from_includes(includes_hash, current_model_class)

def filter_active_storage_from_includes(includes_hash, current_model_class)
  ActiveStorage::Detection.filter_from_includes(includes_hash, current_model_class)
end

def filter_polymorphic_from_includes(includes_hash, current_model_class)

def filter_polymorphic_from_includes(includes_hash, current_model_class)
  ActiveStorage::Detection.filter_polymorphic_from_includes(includes_hash, current_model_class)
end

def find_blob_by_signed_id(signed_id)

def find_blob_by_signed_id(signed_id)
  ActiveStorage::Deserialization.find_blob_by_signed_id(signed_id)
end

def find_relationship_definition(attachment_name, resource_class)

def find_relationship_definition(attachment_name, resource_class)
  ActiveStorage::Deserialization.find_relationship_definition(attachment_name, resource_class)
end

def process_active_storage_attachment(attrs, association_name, id_or_ids, singular:)

def process_active_storage_attachment(attrs, association_name, id_or_ids, singular:)
  ActiveStorage::Deserialization.process_attachment(attrs, association_name, id_or_ids, singular:)
end

def purge_on_nil_enabled?(attachment_name, resource_class)

def purge_on_nil_enabled?(attachment_name, resource_class)
  ActiveStorage::Deserialization.purge_on_nil_enabled?(attachment_name, resource_class)
end

def resolve_model_class_for_attachment

def resolve_model_class_for_attachment
  return send(:model_class) if respond_to?(:model_class, true)
  return send(:resource_model_class) if respond_to?(:resource_model_class, true)
  return send(:resource).class if respond_to?(:resource, true) && send(:resource).respond_to?(:class)
  raise NotImplementedError, "Must implement resource_model_class or provide model_class parameter"
end

def resource_model_class

def resource_model_class
  raise NotImplementedError, "Must implement resource_model_class or override active_storage_attachment?"
end

def serialize_active_storage_relationship(attachment_name, record)

def serialize_active_storage_relationship(attachment_name, record)
  ActiveStorage::Serialization.serialize_relationship(attachment_name, record)
end

def serialize_blob_identifier(blob)

def serialize_blob_identifier(blob)
  ActiveStorage::Serialization.serialize_blob_identifier(blob)
end