<?php

namespace Drupal\views\Plugin\views\display;

use Symfony\Component\Routing\RouteCollection;

/**
 * Defines an interface for displays that can collect routes.
 *
 * In addition to implementing the interface, specify 'uses_routes' in the
 * plugin definition.
 */
interface DisplayRouterInterface extends DisplayPluginInterface {

  /**
   * Adds the route entry of a view to the collection.
   *
   * @param \Symfony\Component\Routing\RouteCollection $collection
   *   A collection of routes that should be registered for this resource.
   */
  public function collectRoutes(RouteCollection $collection);

  /**
   * Alters a collection of routes and replaces definitions to the view.
   *
   * Most of the collections won't have the needed route, so by the return value
   * the method can specify to break the search.
   *
   * @param \Symfony\Component\Routing\RouteCollection $collection
   *
   * @return array
   *   Returns a list of "$view_id.$display_id" elements which got overridden.
   */
  public function alterRoutes(RouteCollection $collection);

  /**
   * Generates a URL to this display.
   *
   * @return \Drupal\Core\Url
   *   A URL object for the display.
   */
  public function getUrlInfo();

  /**
   * Returns the route name for the display.
   *
   * The default route name for a display is views.$view_id.$display_id. Some
   * displays may override existing routes; in these cases, the route that is
   * overridden is returned instead.
   *
   * @return string
   *   The name of the route
   *
   * @see \Drupal\views\Plugin\views\display\DisplayRouterInterface::alterRoutes()
   * @see \Drupal\views\Plugin\views\display\DisplayRouterInterface::getAlteredRouteNames()
   */
  public function getRouteName();

  /**
   * Returns the list of routes overridden by Views.
   *
   * @return string[]
   *   An array of overridden route names. The keys are in the form
   *   view_id.display_id and the values are the route names.
   *
   * @see \Drupal\views\Plugin\views\display\DisplayRouterInterface::alterRoutes()
   */
  public function getAlteredRouteNames();

}
