class Avo::Index::ResourceControlsComponent

def can_detach?

def can_detach?
  is_has_many_association? ? super : false
end

def can_edit?

def can_edit?
  # Disable edit for ArrayResources
  return false if @resource.resource_type_array?
  return authorize_association_for(:edit) if @reflection.present?
  @resource.authorization.authorize_action(:edit, raise_exception: false)
end

def edit_path

def edit_path
  # Add the `view` param to let Avo know where to redirect back when the user clicks the `Cancel` button.
  args = {via_view: "index"}
  if @parent_record.present?
    args = {
      via_resource_class: parent_resource.class.to_s,
      via_record_id: @parent_record.to_param
    }
  end
  helpers.edit_resource_path(record: @resource.record, resource: parent_or_child_resource, **args)
end

def hidden_params

def hidden_params
  hidden = {}
  hidden[:view_type] = params[:view_type] if params[:view_type]
  hidden[:view] = parent_resource&.view&.to_s
  if params[:turbo_frame]
    hidden[:turbo_frame] = params[:turbo_frame]
    hidden[:referrer] = referrer_path
  end
  hidden.compact
end

def is_has_many_association?

def is_has_many_association?
  @reflection.class.in? [
    ActiveRecord::Reflection::HasManyReflection,
    ActiveRecord::Reflection::HasAndBelongsToManyReflection,
    ActiveRecord::Reflection::ThroughReflection
  ]
end

def parent_resource

def parent_resource
  return @parent_resource if @parent_resource.present?
  return nil if @parent_record.blank?
  Avo.resource_manager.get_resource_by_model_class @parent_record.class
end

def referrer_path

def referrer_path
  Avo.root_path(paths: ["resources", params[:resource_name], params[:id], params[:related_name]], query: request.query_parameters.to_h)
end

def render_delete_button(control)

def render_delete_button(control)
  # If the resource is a related resource, we use the can_delete? policy method because it uses
  # authorize_association_for(:destroy).
  # Otherwise we use the can_see_the_destroy_button? policy method because it do no check for association
  # only for authorize_action .
  policy_method = is_a_related_resource? ? :can_delete? : :can_see_the_destroy_button?
  return unless send policy_method
  a_button url: helpers.resource_path(record: @resource.record, resource: @resource),
    style: :icon,
    color: :gray,
    icon: "avo/trash",
    form_class: "flex flex-col sm:flex-row sm:inline-flex",
    title: control.title,
    aria: {label: control.title},
    method: :delete,
    params: hidden_params,
    data: {
      turbo_frame: params[:turbo_frame],
      turbo_confirm: control.confirmation_message,
      turbo_method: :delete,
      target: "control:destroy",
      control: :destroy,
      tippy: control.title ? :tooltip : nil,
      "resource-id": @resource.record_param,
    }
end

def render_detach_button(control)

def render_detach_button(control)
  return unless can_detach?
  a_button url: helpers.resource_detach_path(params[:resource_name], params[:id], params[:related_name], @resource.record_param),
    style: :icon,
    color: :gray,
    icon: "avo/detach",
    form_class: "flex items-center",
    title: control.title,
    aria: {label: control.title},
    method: :delete,
    params: hidden_params,
    data: {
      turbo_frame: params[:turbo_frame],
      turbo_confirm: control.confirmation_message,
      target: "control:detach",
      control: :detach,
      "resource-id": @resource.record_param,
      tippy: :tooltip,
    }
end

def render_edit_button(control)

def render_edit_button(control)
  return unless can_edit?
  link_to helpers.svg("avo/edit", class: svg_classes),
    edit_path,
    class: "flex items-center",
    title: control.title,
    aria: {label: control.title},
    data: {
      target: "control:edit",
      control: :edit,
      "resource-id": @resource.record_param,
      tippy: "tooltip",
    }
end

def render_order_controls(control)

def render_order_controls(control)
  if try(:can_reorder?)
    render Avo::Pro::Ordering::ButtonsComponent.new resource: @resource, reflection: @reflection, view_type: @view_type
  end
end

def render_show_button(control)

def render_show_button(control)
  return unless can_view?
  link_to helpers.svg("avo/eye", class: svg_classes),
    show_path,
    class: "flex items-center",
    title: control.title,
    aria: {label: control.title},
    data: {
      target: "control:view",
      control: :show,
      tippy: "tooltip",
    }
end

def show_path

def show_path
  helpers.resource_show_path(resource: @resource, parent_or_child_resource: parent_or_child_resource, parent_resource: parent_resource, parent_record: @parent_record)
end

def singular_resource_name

def singular_resource_name
  if @reflection.present?
    field&.name&.singularize || reflection_resource.name
  else
    @resource.singular_name.present? ? @resource.singular_name : @resource.model_class.model_name.name.downcase
  end
end

def svg_classes

def svg_classes
  "text-gray-600 h-6 hover:text-gray-600"
end

def view_type

def view_type
  params[:view_type]
end