<?php

use \Drupal\Core\Url;

/**
 * @file
 * Main file of View Mode Selector module.
 */

/**
 * Implements hook_entity_view_mode_alter().
 */
function view_mode_selector_entity_view_mode_alter(&$view_mode, Drupal\Core\Entity\EntityInterface $entity, $context) {
  if ($view_mode !== 'view_mode_selector') {
    return;
  }

  // Set view mode to 'Default', this is for entities without
  // a view mode selector field.
  $view_mode = 'default';

  // Find the first view mode selector field and change the view mode.
  $fields = \Drupal::entityManager()->getFieldDefinitions($entity->getEntityTypeId(), $entity->bundle());
  foreach ($fields as $field_name => $field) {
    if ($field->getType() == 'view_mode_selector' && $field_value = $entity->{$field_name}->value) {
      $view_mode = $field_value;
      break;
    }
  }

  return $view_mode;
}

/**
 * Implements hook_entity_view_mode_info_alter().
 */
function view_mode_selector_entity_view_mode_info_alter(&$view_modes) {
  // Load all view mode selector fields.
  $storage = \Drupal::entityManager()->getStorage('field_config');
  $field_ids = \Drupal::entityQuery('field_config')
    ->condition('field_type', 'view_mode_selector')
    ->execute();

  $fields = $storage->loadMultiple($field_ids);

  // Create the extra fields which represent the field deltas.
  /** @var \Drupal\field\Entity\FieldConfig $field */
  foreach ($fields as $field) {
    $entity_type = $field->getTargetEntityTypeId();

    // Load the view mode selector view mode and add it to the list.
    $storage = \Drupal::entityManager()->getStorage('entity_view_mode');
    $id = $entity_type . '.view_mode_selector';
    $view_mode = $storage->load($id);
    if (!$view_mode) {
      // Create the view mode if it does not exist.
      $view_mode = $storage->create([
        'label' => t('View mode selector'),
        'id' => $id,
        'status' => true, // must be true; see: drupal.org/node/2322503
        'targetEntityType' => $entity_type
      ], 'entity_view_mode');
      $view_mode->save();
    };

    $view_modes[$entity_type]['view_mode_selector'] = $view_mode->toArray();
  }
}

/**
 * Implements hook_form_FORM_ID_alter().
 */
function view_mode_selector_form_entity_view_display_edit_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {
  $form_object = $form_state->getFormObject();
  /** @var $view_display \Drupal\Core\Entity\Entity\EntityViewDisplay **/
  $view_display = $form_object->getEntity();

  if ($view_display->getMode() == 'view_mode_selector') {
    drupal_set_message(t('This is a placeholder view mode from the <a href="@view-mode-selector">View Mode Selector</a> module. It will be replaced with a selected view mode.', [
      '@view-mode-selector' => Url::fromUri('https://www.drupal.org/project/view_mode_selector'),
    ]), 'status');
    drupal_set_message(t('The field settings have been disabled by the <a href="@view-mode-selector">View Mode Selector</a> module.', [
      '@view-mode-selector' => Url::fromUri('https://www.drupal.org/project/view_mode_selector'),
    ]), 'warning');
    $form['fields']['#disabled'] = TRUE;
  }
}
