<?php

namespace Drupal\Core\Entity\Display;

use Drupal\Core\Config\Entity\ConfigEntityInterface;
use Drupal\Core\Entity\EntityWithPluginCollectionInterface;

/**
 * Provides a common interface for entity displays.
 */
interface EntityDisplayInterface extends ConfigEntityInterface, EntityWithPluginCollectionInterface {

  /**
   * Creates a duplicate of the entity display object on a different view mode.
   *
   * The new object necessarily has the same $targetEntityType and $bundle
   * properties than the original one.
   *
   * @param string $view_mode
   *   The view mode for the new object.
   *
   * @return static
   *   A duplicate of this object with the given view mode.
   */
  public function createCopy($view_mode);

  /**
   * Gets the display options for all components.
   *
   * @return array
   *   The array of display options, keyed by component name.
   */
  public function getComponents();

  /**
   * Gets the display options set for a component.
   *
   * @param string $name
   *   The name of the component.
   *
   * @return array|null
   *   The display options for the component, or NULL if the component is not
   *   displayed.
   */
  public function getComponent($name);

  /**
   * Sets the display options for a component.
   *
   * @param string $name
   *   The name of the component.
   * @param array $options
   *   The display options.
   *
   * @return $this
   */
  public function setComponent($name, array $options = []);

  /**
   * Sets a component to be hidden.
   *
   * @param string $name
   *   The name of the component.
   *
   * @return $this
   */
  public function removeComponent($name);

  /**
   * Gets the highest weight of the components in the display.
   *
   * @return int|null
   *   The highest weight of the components in the display, or NULL if the
   *   display is empty.
   */
  public function getHighestWeight();

  /**
   * Gets the renderer plugin for a field (e.g. widget, formatter).
   *
   * @param string $field_name
   *   The field name.
   *
   * @return \Drupal\Core\Field\PluginSettingsInterface|null
   *   A widget or formatter plugin or NULL if the field does not exist.
   */
  public function getRenderer($field_name);

  /**
   * Gets the entity type for which this display is used.
   *
   * @return string
   *   The entity type id.
   */
  public function getTargetEntityTypeId();

  /**
   * Gets the view or form mode to be displayed.
   *
   * @return string
   *   The mode to be displayed.
   */
  public function getMode();

  /**
   * Gets the original view or form mode that was requested.
   *
   * @return string
   *   The original mode that was requested.
   */
  public function getOriginalMode();

  /**
   * Gets the bundle to be displayed.
   *
   * @return string
   *   The bundle to be displayed.
   */
  public function getTargetBundle();

  /**
   * Sets the bundle to be displayed.
   *
   * @param string $bundle
   *   The bundle to be displayed.
   *
   * @return $this
   */
  public function setTargetBundle($bundle);

}
