module ViewModel::ActiveRecord::NestedControllerBase

def association_data

def association_data
  owner_viewmodel._association_data(association_name)
end

def destroy_association(collection, serialize_context: new_serialize_context, deserialize_context: new_deserialize_context)

def destroy_association(collection, serialize_context: new_serialize_context, deserialize_context: new_deserialize_context)
  empty_update = collection ? [] : nil
  owner_viewmodel.deserialize_from_view(owner_update_hash(empty_update),
                                        deserialize_context: deserialize_context)
  render_viewmodel(empty_update, serialize_context: serialize_context)
end

def nested_in(owner, as:)

def nested_in(owner, as:)
  unless owner.is_a?(Class) && owner < ViewModel::Record
    owner = ViewModel::Registry.for_view_name(owner.to_s.camelize)
  end
  self.owner_viewmodel = owner
  raise ArgumentError.new("Could not find owner ViewModel class '#{owner_name}'") if owner_viewmodel.nil?
  self.association_name = as
end

def owner_update_hash(update)

def owner_update_hash(update)
  {
    ViewModel::ID_ATTRIBUTE   => owner_viewmodel_id,
    ViewModel::TYPE_ATTRIBUTE => owner_viewmodel.view_name,
    association_name.to_s     => update,
  }
end

def owner_viewmodel_id(required: true)

def owner_viewmodel_id(required: true)
  id_param_name = owner_viewmodel.view_name.underscore + '_id'
  default = required ? {} : { default: nil }
  parse_param(id_param_name, **default)
end

def show_association(scope: nil, serialize_context: new_serialize_context)

def show_association(scope: nil, serialize_context: new_serialize_context)
  associated_views = nil
  pre_rendered = owner_viewmodel.transaction do
    owner_view = owner_viewmodel.find(owner_viewmodel_id, eager_include: false, serialize_context: serialize_context)
    ViewModel::Callbacks.wrap_serialize(owner_view, context: serialize_context) do
      # Association manipulation methods construct child contexts internally
      associated_views = owner_view.load_associated(association_name, scope: scope, serialize_context: serialize_context)
      associated_views = yield(associated_views) if block_given?
      child_context = owner_view.context_for_child(association_name, context: serialize_context)
      prerender_viewmodel(associated_views, serialize_context: child_context)
    end
  end
  render_json_string(pre_rendered)
  associated_views
end

def write_association(serialize_context: new_serialize_context, deserialize_context: new_deserialize_context)

def write_association(serialize_context: new_serialize_context, deserialize_context: new_deserialize_context)
  association_view = nil
  pre_rendered = owner_viewmodel.transaction do
    update_hash, refs = parse_viewmodel_updates
    owner_view = owner_viewmodel.find(owner_viewmodel_id, eager_include: false, serialize_context: serialize_context)
    association_view = owner_view.replace_associated(association_name, update_hash,
                                                     references: refs,
                                                     deserialize_context: deserialize_context)
    ViewModel::Callbacks.wrap_serialize(owner_view, context: serialize_context) do
      child_context = owner_view.context_for_child(association_name, context: serialize_context)
      ViewModel.preload_for_serialization(association_view, serialize_context: child_context)
      association_view = yield(association_view) if block_given?
      prerender_viewmodel(association_view, serialize_context: child_context)
    end
  end
  render_json_string(pre_rendered)
  association_view
end