<?php
/**
 * @file
 * General functions for the db module
 */

require_once 'api/tripal_db.api.inc';
require_once 'api/tripal_db.DEPRECATED.inc';

require_once 'includes/tripal_db.admin.inc';

/**
 * @defgroup tripal_db Database Reference Module
 * @ingroup tripal_modules
 * @{
 * Provides functions for managing chado database references which link chado content, such
 * as features and stocks, to records/pages in external databases/websites. For example,
 * you might have a feature record in your site which is also in the NCBI website and by
 * adding a database refrence to your feature, an automatic link to the content at NCBI
 * is created.
 * @}
 */

/**
 * Implements hook_menu().
 *
 * @ingroup tripal_db
 */
function tripal_db_menu() {
  $items = array();

  $items['admin/tripal/chado/tripal_db'] = array(
    'title' => 'Databases',
    'description' => 'References to External Database sites such as NCBI',
    'page callback' => 'tripal_db_admin_db_listing',
    'access arguments' => array('administer db cross-references'),
    'type' => MENU_NORMAL_ITEM,
  );

  $items['admin/tripal/chado/tripal_db/help'] = array(
    'title' => 'Help',
    'description' => "A description of the Tripal Database module including a short description of it's usage.",
    'page callback' => 'theme',
    'page arguments' => array('tripal_db_admin'),
    'access arguments' => array('administer db cross-references'),
    'type' => MENU_LOCAL_TASK,
    'weight' => 10
  );

  $items['admin/tripal/chado/tripal_db/edit/%'] = array(
    'title' => 'Edit a Database Reference',
    'description' => 'Edit existing Database References.',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('tripal_db_db_edit_form',5),
    'access callback' => 'user_access',
    'access arguments' => array('administer db cross-references'),
    'type' => MENU_CALLBACK,
  );

  $items['admin/tripal/chado/tripal_db/add'] = array(
    'title' => 'Create a Database Reference',
    'description' => 'Create a new reference to an External Database.',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('tripal_db_db_add_form'),
    'access callback' => 'user_access',
    'access arguments' => array('administer db cross-references'),
    'type' => MENU_CALLBACK,
  );

  $items['admin/tripal/chado/tripal_db/views/dbs/enable'] = array(
    'title' => 'Enable Database Administrative View',
    'page callback' => 'tripal_enable_view',
    'page arguments' => array('tripal_db_admin_dbs', 'admin/tripal/chado/tripal_db'),
    'access arguments' => array('administer db cross-references'),
    'type' => MENU_CALLBACK,
  );
  $items['admin/tripal/chado/tripal_db/views/dbxrefs/enable'] = array(
    'title' => 'Enable Reference Administrative View',
    'page callback' => 'tripal_enable_view',
    'page arguments' => array('tripal_db_admin_dbxrefs', 'admin/tripal/chado/tripal_db'),
    'access arguments' => array('administer db cross-references'),
    'type' => MENU_CALLBACK,
  );
  $items['admin/tripal/chado/tripal_db/dbxref/auto_name/%/%'] = array(
    'page callback' => 'tripal_db_dbxref_accession_autocomplete',
    'page arguments' => array(6, 7),
    'access arguments' => array('administer db cross-references'),
    'type' => MENU_CALLBACK,
  );

  return $items;
}

/**
 * Implements hook_help().
 (
 * Purpose: Adds a help page to the module list
 */
function tripal_db_help ($path, $arg) {
  if ($path == 'admin/help#tripal_db') {
    return theme('tripal_db_help', array());
  }
}

/**
 * Implements hook_permission().
 *
 * Set the permission types that the chado module uses.  Essentially we
 *  want permissionis that protect creation, editing and deleting of chado
 *  data objects
 *
 * @ingroup tripal_db
 */
function tripal_db_permission() {
  return array(
    'administer db cross-references' => array(
      'title' => t('Administer External Database Cross-references.'),
      'description' => t('Allows the user to add, edit or delete external databases references stored in the Chado database.'),
    ),
  );
}

/**
 * Implements hook_views_api().
 *
 * Essentially this hook tells drupal that there is views support for
 *  for this module which then includes tripal_db.views.inc where all the
 *  views integration code is
 *
 * @ingroup tripal_db
 */
function tripal_db_views_api() {
  return array('api' => 3.0);
}

/**
 *  Implements hook_theme().
 *
 *  We need to let drupal know about our theme functions and their arguments.
 *  We create theme functions to allow users of the module to customize the
 *  look and feel of the output generated in this module
 *
 * @ingroup tripal_db
 */
function tripal_db_theme($existing, $type, $theme, $path) {

 $items = array(
    'tripal_db_help' => array(
      'template' => 'tripal_db_help',
      'variables' =>  array(NULL),
      'path' => "$path/theme/templates"
    )
  );
  return $items;
}


/**
 * This function is intended to be used in autocomplete forms
 * for searching for accession that begin with the provided string
 *
 * @param $db_id
 *   The DB ID in which to search for the term
 * @param $string
 *   The string to search for
 *
 * @return
 *   A json array of terms that begin with the provided string
 *
 * @ingroup tripal_db_api
 */
function tripal_db_dbxref_accession_autocomplete($db_id, $string = '') {
  if (!$db_id) {
    return drupal_json_output(array());
  }
  $sql = "
    SELECT dbxref_id, accession
    FROM {dbxref}
    WHERE db_id = :db_id and lower(accession) like lower(:accession)
    ORDER by accession
    LIMIT 25 OFFSET 0
  ";
  $results = chado_query($sql, array(':db_id' => $db_id, ':accession' => $string . '%'));
  $items = array();
  foreach ($results as $ref) {
    $items[$ref->accession] = $ref->accession;
  }

  drupal_json_output($items);
}