<?php

/**
 * @file
 * Primarily Drupal hooks.
 */

/**
 * Implements hook_menu().
 */
function media_bulk_upload_menu() {
  $items['admin/content/file/import'] = array(
    'title' => 'Import files',
    'description' => 'Import files into your media library.',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('media_bulk_upload_import'),
    'access arguments' => array('import media'),
    'type' => MENU_LOCAL_ACTION,
    'file' => 'includes/media_bulk_upload.admin.inc',
    'weight' => 10,
  );
  $items['admin/content/file/thumbnails/import'] = $items['admin/content/file/import'];

  // @todo Investigate passing file IDs in query string rather than a menu
  // argument and then deprecate media_multi_load().
  $items['admin/content/file/edit-multiple/%media_bulk_upload_multi'] = array(
    'title' => 'Edit multiple files',
    'page callback' => 'media_bulk_upload_file_page_edit_multiple',
    'page arguments' => array(4),
    'access callback' =>  '_media_bulk_upload_file_entity_access_recursive',
    'access arguments' => array(4, 'update'),
    'file' => 'includes/media_bulk_upload.pages.inc',
  );

  return $items;
}

/**
 * Implements hook_permission().
 */
function media_bulk_upload_permission() {
  return array(
    'import media' => array(
      'title' => t('Import media files from the local filesystem'),
      'description' => t('Simple file importer'),
      'restrict access' => TRUE,
    ),
  );
}

/**
 * Implements hook_media_browser_plugin_info_alter().
 */
function media_bulk_upload_media_browser_plugin_info_alter(&$info) {
  $info['upload']['class'] = 'MediaBrowserBulkUpload';
}

/**
 * Implements hook_file_operations().
 */
function media_bulk_upload_file_operations() {
  return array(
    'edit_multiple' => array(
      'label' => t('Edit selected files'),
      'callback' => 'media_bulk_upload_file_operation_edit_multiple',
    ),
  );
}

/**
 * Implements hook_form_alter().
 */
function media_bulk_upload_form_alter(&$form, &$form_state, $form_id) {
  // If we're in the media browser, set the #media_browser key to true
  // so that if an ajax request gets sent to a different path, the form
  // still uses the media_browser_form_submit callback.
  if (current_path() == 'media/browser' && $form_id != 'views_exposed_form') {
    $form_state['#media_browser'] = TRUE;
  }

  // If the #media_browser key isset and is true we are using the browser
  // popup, so add the media_browser submit handler.
  if (!empty($form_state['#media_browser'])) {
    $form['#submit'][] = 'media_bulk_upload_browser_form_submit';
  }
}

/**
 * Submit handler; direction form submissions in the media browser.
 */
function media_bulk_upload_browser_form_submit($form, &$form_state) {
  $url = NULL;
  $parameters = array();

  // Multi upload.
  if (!empty($form_state['files'])) {
    $files = $form_state['files'];
    $url = 'media/browser';
    $parameters = array('query' => array('render' => 'media-popup', 'fid' => array_keys($files)));
  }

  // If $url is set, we had some sort of upload, so redirect the form.
  if (!empty($url)) {
    $form_state['redirect'] = array($url, $parameters);
  }
}

/**
 * Return a URL for editing an files.
 *
 * Works with an array of fids or a single fid.
 *
 * @param mixed $fids
 *   An array of file IDs or a single file ID.
 */
function media_bulk_upload_file_edit_url($fids) {
  if (!is_array($fids)) {
    $fids = array($fids);
  }

  if (count($fids) > 1) {
    return 'admin/content/file/edit-multiple/' . implode(' ', $fids);
  }
  else {
    return 'file/' . reset($fids) . '/edit';
  }
}

/**
 * Callback for the edit operation.
 *
 * Redirects the user to the edit multiple files page.
 *
 * @param array $fids
 *   An array of file IDs.
 *
 * @see media_file_page_edit_multiple()
 */
function media_bulk_upload_file_operation_edit_multiple($fids) {
  // The thumbnail browser returns TRUE/FALSE for each item, so use array keys.
  $fids = array_keys(array_filter($fids));
  drupal_goto(media_bulk_upload_file_edit_url($fids), array('query' => drupal_get_destination()));
}

/**
 * Implements hook_forms().
 */
function media_bulk_upload_forms($form_id, $args) {
  $forms = array();
  // To support the multiedit form, each form has to have a unique ID.
  // So we name all the forms media_edit_N where the first requested form is
  // media_edit_0, 2nd is media_edit_1, etc.
  module_load_include('inc', 'file_entity', 'file_entity.pages');
  if ($form_id != 'media_edit' && (strpos($form_id, 'media_edit') === 0)) {
    $forms[$form_id] = array(
      'callback' => 'file_entity_edit',
    );
  }
  return $forms;
}

/**
 * Access callback for the media-multi form.
 *
 * @param $files
 *   An array of files being editing on the multiform.
 * @param $op
 *   A string containing the operation requested, such as 'update'.
 * @return
 *   TRUE if the current user has access to edit all of the files, otherwise FALSE.
 */
function _media_bulk_upload_file_entity_access_recursive($files, $op) {
  // Check that the current user can access each file.
  if (!empty($files)) {
    foreach ($files as $file) {
      if (!file_entity_access($op, $file)) {
        return FALSE;
      }
    }
    return TRUE;
  }
  return FALSE;
}

/**
 * Load callback for %media_multi placeholder in menu paths.
 *
 * @param string $fids
 *   Separated by space (e.g., "3 6 12 99"). This often appears as "+" within
 *   URLs (e.g., "3+6+12+99"), but Drupal automatically decodes paths when
 *   intializing $_GET['q'].
 *
 * @return array
 *   An array of corresponding file entities.
 */
function media_bulk_upload_multi_load($fids) {
  return file_load_multiple(explode(' ', $fids));
}
