<?php

/**
 * @file
 * Module file for media_pane.
 *
 * Code to modify fieldable panels pane media pane bundle and customize the
 * rendered output.
 */

/**
 * Implements hook_entity_info_alter().
 */
function media_pane_entity_info_alter(&$entity_info) {
  // Admin path.
  $path = 'admin/structure/fieldable-panels-panes/manage/%fieldable_panels_panes_type';

  // Create a new bundle for fieldable panels pane entity called media pane.
  $entity_info['fieldable_panels_pane']['bundles']['media_pane'] = array(
    'label' => t('Media pane'),
    'pane category' => t('Media pane'),
    // Set to true to make this show as a top level icon.
    'pane top level' => FALSE,
    'pane icon' => '',
    'admin' => array(
      'path' => $path,
      'bundle argument' => 4,
      // Note that this has all _ replaced with - from the bundle name.
      'real path' => 'admin/structure/fieldable-panels-panes/manage/media-pane',
      'access arguments' => array('administer fieldable panels panes'),
    ),
  );
}

/**
 * Helper function to collect all available view modes for the file entity.
 *
 * @return array
 *   Return an array of view modes keyed by machine name.
 */
function media_pane_get_view_mode_options() {
  $options = array();

  $file_info = entity_get_info('file');
  foreach ($file_info['view modes'] as $name => $def) {
    $options[$name] = $def['label'];
  }

  return $options;
}

/**
 * Implements hook_preprocess_file_entity().
 *
 * Apply view mode settings on the file entity.
 */
function media_pane_preprocess_file_entity(&$variables) {
  $entity = $variables['referencing_entity'];

  if ($entity->bundle != 'media_pane') {
    return;
  }

  // Get all information about field.
  $field = field_info_field('media_pane_media');
  $instance = field_info_instance('fieldable_panels_pane', 'media_pane_media', 'media_pane');
  $view_mode = key($instance['display']);
  $items = field_get_items('fieldable_panels_pane', $entity, 'media_pane_media');
  $display = field_get_display($instance, $view_mode, $entity);

  // Replace view mode with view mode field.
  $display['settings']['file_view_mode'] = $entity->media_pane_view_modes[LANGUAGE_NONE][0]['value'];
  $new_field = field_default_view('fieldable_panels_pane', $entity, $field, $instance, LANGUAGE_NONE, $items, $display);
  $reset = reset($new_field);
  $variables['elements']['file'] = $reset[0]['file'];
  $variables['content']['file'] = $reset[0]['file'];

  // Load in css for media pane.
  drupal_add_css(drupal_get_path('module', 'media_pane') . '/media_pane.css');
}

/**
 * Implements hook_preprocess_fieldable_panels_pane().
 *
 * Apply view mode settings on the fieldable_panels_pane.
 */
function media_pane_preprocess_fieldable_panels_pane(&$variables) {
  $entity = $variables['elements']['#fieldable_panels_pane'];

  // Get all the field values.
  $fields = array(
    'media_pane_link',
    'media_pane_link_text',
    'media_pane_overlay',
    'media_pane_overlay_text',
  );

  // Check that field values are set, otherwise set to false.
  foreach ($fields as $field_name) {
    if (isset($entity->{$field_name}[LANGUAGE_NONE][0]['value'])) {
      $fields[$field_name] = $entity->{$field_name}[LANGUAGE_NONE][0]['value'];
    }
    else {
      $fields[$field_name] = FALSE;
    }
  }

  // Check the link path has been set.
  if (!$fields['media_pane_link_text']) {
    $variables['elements']['#media_pane_link'] = FALSE;
    $variables['elements']['#media_pane_link_text'] = $fields['media_pane_link_text'];
  }
  else {
    // Prepare media link text for theme_link() in media-pane.tpl.php.
    $variables['elements']['#media_pane_link'] = $fields['media_pane_link'];
    $variables['elements']['#media_pane_link_text'] = array(
      'path' => $fields['media_pane_link_text'],
      'options' => array(
        'attributes' => array(),
        'html' => TRUE,
      ),
    );
  }

  // Create overlay markup.
  if ($fields['media_pane_overlay'] && $fields['media_pane_overlay_text']) {
    $variables['content']['media_pane_overlay'] = array(
      '#weight' => 99,
      '#prefix' => '<h5 class="overlay">',
      '#markup' => $fields['media_pane_overlay_text'],
      '#suffix' => '</h5>',
    );
  }

  // Add module specific theme hook to theme_hook_suggestions.
  $variables['theme_hook_suggestions'][] = 'media_pane_fieldable_panels_pane';
}

/**
 * Implements hook_theme().
 */
function media_pane_theme($existing, $type, $theme, $path) {
  return array(
    'media_pane_fieldable_panels_pane' => array(
      'render element' => 'elements',
      'template' => 'media-pane',
    ),
  );
}

/**
 * Implements hook_form_form_id_alter().
 *
 * Improve UX for user creating a media pane.
 */
function media_pane_form_alter(&$form, &$form_state, $form_id) {
  // Form ID of the form to be altered.
  $id = 'fieldable_panels_panes_fieldable_panels_pane_content_type_edit_form';

  // Only alter form for media pane bundle.
  if ($form_id == $id && $form['#bundle'] == 'media_pane') {

    // Hide link text when not in use.
    $form['media_pane_link_text']['#states'] = array(
      'visible' => array(
        ':input[name="media_pane_link[und]"]' => array('checked' => TRUE),
      ),
    );

    // Hide overlay text when not in use.
    $form['media_pane_overlay_text']['#states'] = array(
      'visible' => array(
        ':input[name="media_pane_overlay[und]"]' => array('checked' => TRUE),
      ),
    );

    // Reduce confusion by clearly labeling the pane view mode field.
    $form['view_mode']['#title'] = t('Pane view mode');
    $path = 'admin/structure/fieldable-panels-panes/manage/media-pane/display';
    $config_link = l(t('here'), $path);
    $form['view_mode']['#description'] .= t(' Click ') .
      $config_link . t(' to configure view modes.');
    $form['view_mode']['#weight'] = 8;

    // Reduce confusion by clearly labeling the media view mode field.
    $config_link = l(t('here'), 'admin/structure/file-types');
    $form['media_pane_view_modes'][LANGUAGE_NONE]['#description'] .= t(' Click ') .
      $config_link . t(' to configure view modes.');
  }
}
