<?php

require_once "jobs.php";
require_once "mviews.php";
require_once "cvterms.php";
require_once "chado_install.php";
require_once "tripal_views_integration.inc";

require_once "tripal_core.api.inc";

/**
 * @defgroup tripal_modules Tripal Modules
 * @{
 * All documented functions for the various Tripal Modules
 * @}
 */

/**
 * @defgroup tripal_core Core Tripal Module
 * @ingroup tripal_modules
 */
 
/**
 *
 *
 * @ingroup tripal_core
 */
function tripal_core_init(){
   // the two lines below are necessary to ensure that the search_path
   // variable is always set.  In the case where a view needs to query the
   // chado schema when it is local to the Drupal database.  Otherwise the
   // search_path isn't set.  When tripal_db_set_active is called it
   // automatically sets the serach path if chado is local to the 
   // Drupal database
   $previous = tripal_db_set_active('chado');
   tripal_db_set_active($previous);

   // create the 'tripal' controlled volcabulary in chado but only if it doesn't already exist, and
   // only if the chado database is present.
   if(tripal_core_is_chado_installed()){
      $previous_db = tripal_db_set_active('chado');  // use chado database
      if(!db_fetch_object(db_query("SELECT * FROM {cv} WHERE name = 'tripal'"))){
         $results = db_query("INSERT INTO {cv} (name,definition) ".
    	                     "VALUES ('tripal','Terms used by Tripal for modules to manage data such as that stored in property tables like featureprop, analysisprop, etc')");
      } 
      if(!db_fetch_object(db_query("SELECT * FROM {db} WHERE name = 'tripal'"))){
         $results = db_query("INSERT INTO {db} (name,description) ". 
	                        "VALUES ('tripal','Used as a database placeholder for tripal defined objects such as tripal cvterms')");
      }  
      tripal_db_set_active($previous_db);  // now use drupal database
   }

   // add some variables for all javasript to use for building URLs
   global $base_url;
   $theme_dir = drupal_get_path('theme', 'tripal');
   $clean_urls  = variable_get('clean_url', 0);
   drupal_add_js("
      var baseurl = '$base_url'; 
      var themedir = '$theme_dir'; 
      var isClean = $clean_urls;",'inline');

   // make sure the date time settings are the way Tripal will insert them
   // otherwise PostgreSQL version that may have a different datestyle setting
   // will fail when inserting or updating a date column in a table.
   db_query("SET DATESTYLE TO '%s'",'MDY');
}



/**
 *
 *
 * @ingroup tripal_core
 */
function tripal_core_menu() {
   $items = array();
   
   // Triapl setting groups
   $items['admin/tripal'] = array(
      'title' => 'Tripal Management',
      'description' => "Manage the behavior or Tripal and its various modules.",
      'position' => 'right',
      'weight' => -5,
      'page callback' => 'system_admin_menu_block_page',
      'access arguments' => array('administer site configuration'),
      'file' => 'system.admin.inc',
      'file path' => drupal_get_path('module', 'system'),
   );
   $items['admin/tripal/tripal_jobs'] = array(
     'title' => 'Jobs',
     'description' => 'Jobs managed by Tripal',
     'page callback' => 'tripal_jobs_report',
     'access arguments' => array('access administration pages'),
     'type' => MENU_NORMAL_ITEM,
   );
   $items['admin/tripal/tripal_jobs/cancel/%'] = array(
     'title' => 'Jobs',
     'description' => 'Cancel a pending job',
     'page callback' => 'tripal_jobs_cancel',
     'page arguments' => array(4),
     'access arguments' => array('access administration pages'),
     'type' => MENU_CALLBACK,
   );
   $items['admin/tripal/tripal_jobs/rerun/%'] = array(
     'title' => 'Jobs',
     'description' => 'Re-run an existing job.',
     'page callback' => 'tripal_jobs_rerun',
     'page arguments' => array(4),
     'access arguments' => array('access administration pages'),
     'type' => MENU_CALLBACK,
   );
   $items['admin/tripal/tripal_jobs/view/%'] = array(
     'title' => 'Jobs Details',
     'description' => 'View job details.',
     'page callback' => 'tripal_jobs_view',
     'page arguments' => array(4),
     'access arguments' => array('access administration pages'),
     'type' => MENU_CALLBACK,
   );
   $items['tripal_toggle_box_menu/%/%/%'] = array(
     'title' => t('Libraries'),
     'page callback' => 'tripal_toggle_box_menu',
     'page arguments' => array(1,2,3),
     'access arguments' => array('access administration pages'),
     'type' => MENU_CALLBACK | MENU_LINKS_TO_PARENT 
   );
   $items['admin/tripal/chado_1_11_install'] = array(
     'title' => 'Install Chado v1.11',
     'description' => 'Installs Chado version 1.11 inside the current Drupal database',
     'page callback' => 'drupal_get_form',
     'page arguments' => array('tripal_core_chado_v1_11_load_form'),
     'access arguments' => array('access administration pages'),
     'type' => MENU_NORMAL_ITEM,
   );

   $items['admin/tripal/views'] = array(
     'title' => t('Views'),
     'description' => 'Management of Materialized Views & Integration with Drupal Views',
     'page callback' => 'tripal_core_views_description_page',
     'access arguments' => array('administer site configuration'),
     'type' => MENU_NORMAL_ITEM,
   );
   $items['admin/tripal/views/mviews'] = array(
     'title' => 'MViews',
     'description' => 'Materialized views are used to improve speed of large or complex queries.',
     'page callback' => 'tripal_mviews_report',
     'access arguments' => array('access administration pages'),
     'type' => MENU_NORMAL_ITEM,
   );
   $items['admin/tripal/views/mviews/report/%'] = array(
     'title' => 'Materialized View',
     'description' => 'Materialized views are used to improve speed of large or complex queries.',
     'page callback' => 'tripal_mview_report',
     'page arguments' => array(5),
     'access arguments' => array('access administration pages'),
     'type' => MENU_NORMAL_ITEM,
   );
   $items['admin/tripal/views/mviews/new'] = array(
     'title' => 'Create MView',
     'description' => 'Materialized views are used to improve speed of large or complex queries.',
     'page callback' => 'drupal_get_form',
     'page arguments' => array('tripal_mviews_form'),
     'access arguments' => array('access administration pages'),
     'type' => MENU_NORMAL_ITEM,
   );
   $items['admin/tripal/views/mviews/edit/%'] = array(
     'title' => 'Edit MView',
     'page callback' => 'drupal_get_form',
     'page arguments' => array('tripal_mviews_form',5),
     'access arguments' => array('access administration pages'),
     'type' => MENU_NORMAL_ITEM,
   );
   $items['admin/tripal/views/mviews/action/%/%'] = array(
     'title' => 'Create MView',
     'description' => 'Materialized views are used to improve speed of large or complex queries.',
     'page callback' => 'tripal_mviews_action',
     'page arguments' => array(5,6),
     'access arguments' => array('access administration pages'),
     'type' => MENU_CALLBACK,
   );
	$items['admin/tripal/views/integration'] = array(
    'title' => t('Drupal Views Integration'),
    'description' => t('Allows you to select existing materialized views and provide details for integration with Drupal Views.'),
    'page callback' => 'drupal_get_form',
    'page arguments' => array('tripal_core_views_integration_admin_form'),
    'access arguments' => array('manage tripal_views_integration'),
    'type' => MENU_NORMAL_ITEM,
	);
	$items['admin/tripal/views/integration/mviews'] = array(
    'title' => t('Integrated MViews'),
    'description' => t('Allows you to select existing materialized views and provide details for integration with Drupal Views.'),
    'page callback' => 'drupal_get_form',
    'page arguments' => array('tripal_core_views_integration_admin_form'),
    'access arguments' => array('manage tripal_views_integration'),
    'type' => MENU_NORMAL_ITEM,
	);

	//page to actually create setup->mview->chado table relationships
	$items['admin/tripal/views/integration/mviews/new'] = array(
     'title' => 'Add an MView',
     'page callback' => 'drupal_get_form',
     'page arguments' => array('tripal_core_views_integration_new_setup_form'),
     'access arguments' => array('manage tripal_views_integration'), //TODO: figure out the proper permissions arguments
     'type' => MENU_NORMAL_ITEM,
	);

	$items['admin/tripal/views/integration/chado'] = array(
    'title' => t('Integrated Chado Table'),
    'description' => t('Tripal Views Setups settings page, allows you to select and create materialized views and chado tables to use for searches.'),
    'page callback' => 'drupal_get_form',
    'page arguments' => array('tripal_core_views_integration_admin_form'),
    'access arguments' => array('manage tripal_views_integration'),
    'type' => MENU_NORMAL_ITEM,
	);
	$items['admin/tripal/views/integration/chado/new'] = array(
     'title' => 'Add a Chado table',
     'page callback' => 'drupal_get_form',
     'page arguments' => array('tripal_core_views_integration_new_setup_form'),
     'access arguments' => array('manage tripal_views_integration'), //TODO: figure out the proper permissions arguments
     'type' => MENU_NORMAL_ITEM,
	);
  return $items;
}


/**
 *  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_core
 */
function tripal_core_perm(){
   return array(
      'manage tripal_views_integration',
   );
}
/**
 *
 *
 * @param $dbname
 *   The name of the database to switch to as indicated in settings.php
 *   Should be either default or chado
 *
 * @return 
 *   The name of the previously set database
 *
 * @ingroup tripal_chado_api
 */
function tripal_core_is_chado_installed(){
   global $db_url, $db_type;

   // first check if chado is in the db_url of the 
   // settings.php file
   if(is_array($db_url)){ 
      if(isset($db_url['chado'])){
         return true;
      } 
   }
   // check to make sure the chado schema exists
   $sql = "select nspname from pg_catalog.pg_namespace where nspname = 'chado'";
   if(db_fetch_object(db_query($sql))){
      return true;
   }
   return false;
}

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


/**
 *
 * @ingroup tripal_core
 */
function tripal_core_theme () {
   return array(      
      'tripal_core_job_view' => array (
         'arguments' => array('job_id'=> null),
         'template' => 'tripal_core_job_view',
      ),
	  'tripal_core_views_integration_new_setup_form' => array(
         'arguments' => array('form' => NULL),
         'template'  => 'tripal_views_integration_fields_form',
	   ),
   );
}
/**
 *
 * @ingroup tripal_core
 */
function tripal_core_job_describe_args($callback,$args){
   $new_args = array();
   if($callback == 'tripal_update_mview'){
      // get this mview details
      $sql = "SELECT * FROM {tripal_mviews} WHERE mview_id = %d ";
      $mview = db_fetch_object(db_query($sql,$args[0]));     
      $new_args['View Name'] = $mview->name;
   }
   return $new_args;
}

// this is just a wrapper for backwards compatibility with a naming mistake.
// it can go away in the future as it only is useful for jobs created by v0.3b 
function tripal_core_load_gff3($gff_file, $organism_id,$analysis_id,$add_only =0, 
   $update = 0, $refresh = 0, $remove = 0, $job = NULL)
{
   tripal_feature_load_gff3($gff_file, $organism_id,$analysis_id,$add_only, 
      $update, $refresh, $remove, $job);
}