class JsonapiCompliable::Sideload::BelongsTo < JsonapiCompliable::Sideload
  def type
    :belongs_to
  end

  def load_params(parents, query)
    query.to_hash.tap do |hash|
      hash[:filter] ||= {}
      hash[:filter][primary_key] = ids_for_parents(parents)
    end
  end

  def assign_each(parent, children)
    children.find { |c| c.send(primary_key) == parent.send(foreign_key) }
  end

  def ids_for_parents(parents)
    parent_ids = parents.map(&foreign_key)
    parent_ids.compact!
    parent_ids.uniq!
    parent_ids
  end

  def infer_foreign_key
    if polymorphic_child?
      parent.foreign_key
    else
      model = resource.model
      namespace = namespace_for(model)
      model_name = model.name.gsub("#{namespace}::", '')
      :"#{model_name.underscore}_id"
    end
  end
end