<?php
/**
 * A function to render a listing of all publication importers
 *
 * @ingroup tripal_pub
 */
function tripal_pub_importers_list() {
  $header = array('', 'Importer Name', 'Database', 'Search String', 'Disabled', 'Create Contact', '');
  $rows = array();
  $importers = db_query("SELECT * FROM {tripal_pub_import} ORDER BY name");    

  while ($importer = db_fetch_object($importers)) {
    $criteria = unserialize($importer->criteria);
    $num_criteria = $criteria['num_criteria'];
    $criteria_str = '';
    for ($i = 0; $i <= $num_criteria; $i++) {
      $search_terms = $criteria['criteria'][$i]['search_terms'];
      $scope = $criteria['criteria'][$i]['scope'];
      $operation = $criteria['criteria'][$i]['operation'];
      $criteria_str .= "$operation ($scope: $search_terms) ";
    }
 
    $rows[] = array(
      l(t('Edit/Test'), "admin/tripal/tripal_pub/import/edit/$importer->pub_import_id"),
      $importer->name,
      $criteria['remote_db'],
      $criteria_str,
      $importer->disabled ? 'Yes' : 'No',
      $importer->do_contact ? 'Yes' : 'No',
      l(t('Delete'), "admin/tripal/tripal_pub/import/delete/$importer->pub_import_id"),
    );
  }

  $rows[] = array(
    'data' => array(
      array('data' => l(t('Create a new publication importer.'), "admin/tripal/tripal_pub/import/new"),
        'colspan' => 7),
    )
  );

  $page = theme('table', $header, $rows);
  return $page;
}

/*
 * 
 */
function tripal_pub_importer_setup($action = 'new', $pub_import_id = NULL) {
  global $pager_total, $pager_total_items;
  
  $pager_id = 0;
  $limit = 10;
  
  // generate the search form 
  $form = drupal_get_form('tripal_pub_importer_setup_form',  $pub_import_id, $action);
  
  $output = l("Return to publication importers list", "admin/tripal/tripal_pub/import_list");
  $output .= $form;

  // retrieve any results
  $remote_db = $_SESSION['tripal_pub_search']['remote_db'];
  $num_criteria = $_SESSION['tripal_pub_search']['num_criteria'];
  $days = $_SESSION['tripal_pub_search']['days'];
 
  $search_array = array();
  $search_array['remote_db'] = $remote_db;
  $search_array['num_criteria'] = $num_criteria;
  $search_array['days'] = $days; 
  for ($i = 0; $i <= $num_criteria; $i++) {
    $search_array['criteria'][$i]['search_terms'] = $_SESSION['tripal_pub_search']['criteria'][$i]['search_terms'];
    $search_array['criteria'][$i]['scope'] = $_SESSION['tripal_pub_search']['criteria'][$i]['scope'];  
    $search_array['criteria'][$i]['operation'] = $_SESSION['tripal_pub_search']['criteria'][$i]['operation'];
  }
  
    
  if ($_SESSION['tripal_pub_search']['perform_search']) {
    // get the list of publications from the remote database using the search criteria.  
    $pubs = tripal_pub_get_remote_search_results($remote_db, $search_array, $limit, $pager_id);
  
    // generate the pager
    $total_pages = $pager_total[$pager_id];
    $total_items = $pager_total_items[$pager_id];
    $page = isset($_GET['page']) ? $_GET['page'] : '0';
    $pager = theme('pager');
    
    // iterate through the results and construct the table displaying the publications
    $rows = array();
    $i = $page * $limit + 1;
    if (count($pubs) > 0) {
      foreach ($pubs as $pub) {
        $rows[] = array(number_format($i), $pub['Citation']);
        $i++;
      }
    }
    $headers = array('', 'Citation');
    $table = theme('table', $headers, $rows);   
  
    // join all to form the results
    $output .= "<br><p><b>Found " . number_format($total_items) .  
      ". Page " . ($page + 1) . " of $total_pages. " .
      " Results</b></br>" . $table . '</p>' . $pager;    
  }
  return $output;
}
/*
 * 
 */
function theme_tripal_pub_importer_setup_form($form) {
  $rows = array();
  foreach ($form['criteria'] as $i => $element) {
    if(is_numeric($i)) {
      $rows[] = array(  
        array('data' => drupal_render($element["operation-$i"]), 'width' => '10%'),    
        array('data' => drupal_render($element["scope-$i"]), 'width' => '10%'),
        drupal_render($element["search_terms-$i"]),
        array('data' => drupal_render($element["add-$i"]) . drupal_render($element["remove-$i"]), 'width' => '5%'),
      );
    }
  } 
  $headers = array('Operation','Scope', 'Search Terms', '');
  
  $markup  = '<div id="pub-search-form-row1">';
  $markup .= '  <div id="pub-search-form-col1">' . drupal_render($form['loader_name']) . '</div>';
  $markup .= '  <div id="pub-search-form-col2">' . drupal_render($form['remote_db']) . '</div>';
  $markup .= '  <div id="pub-search-form-col3">' . drupal_render($form['days']) . '</div>';
  $markup .= '</div>';
  $markup .= '<div id="pub-search-form-row2">' . drupal_render($form['disabled']) . '</div>'; 
  $markup .= '<div id="pub-search-form-row3">' . drupal_render($form['do_contact']) . '</div>';
  $markup .= theme('table', $headers, $rows);
  
  $form['criteria'] = array(
    '#type' => 'markup',
    '#value' =>  $markup,
    '#weight' => -10,
  );
  return drupal_render($form);
}
/**
 * Purpose: Provides the form to search pubmed
 *
  * @ingroup tripal_pub
 */
function tripal_pub_importer_setup_form(&$form_state = NULL, $pub_import_id = NULL, $action = 'new') {
  tripal_core_ahah_init_form();

  dpm($form_state);
  
  // Set the default values. If the pub_import_id isn't already defined by the form values 
  // and one is provided then look it up in the database
  $criteria = NULL;
  if ($action == "edit" and !$form_state['values']) {
    $sql = "SELECT * FROM {tripal_pub_import} WHERE pub_import_id = %d";
    $importer = db_fetch_object(db_query($sql, $pub_import_id));
    
    $criteria       = unserialize($importer->criteria);
    $remote_db      = $criteria['remote_db'];
    $days           = $criteria['days'];
    $disabled       = $criteria['disabled'];
    $do_contact     = $criteria['do_contact'];
    $num_criteria   = $criteria['num_criteria'];    
    $loader_name    = $criteria['loader_name'];  
  }

  // if the session has variables then use those.  This should only happen when
  // the 'Test Criteria' button is clicked.
  $num_criteria = $_SESSION['tripal_pub_search']['num_criteria'] ? $_SESSION['tripal_pub_search']['num_criteria'] : $num_criteria;    
  $loader_name  = $_SESSION['tripal_pub_search']['loader_name']  ? $_SESSION['tripal_pub_search']['loader_name']  : $loader_name;
  $remote_db    = $_SESSION['tripal_pub_search']['remote_db']    ? $_SESSION['tripal_pub_search']['remote_db']    : $remote_db;
  $disabled     = $_SESSION['tripal_pub_search']['disabled']     ? $_SESSION['tripal_pub_search']['disabled']     : $disabled;    
  $do_contact   = $_SESSION['tripal_pub_search']['do_contact']   ? $_SESSION['tripal_pub_search']['do_contact']   : $do_contact;
  $days         = $_SESSION['tripal_pub_search']['days']         ? $_SESSION['tripal_pub_search']['days']         : $days;    
  
  
  // If the form_state has variables then use those.  This happens when an error occurs on the form or the 
  // form is resbumitted using AJAX
  $num_criteria = $form_state['values']['num_criteria'] ? $form_state['values']['num_criteria'] : $num_criteria;    
  $loader_name  = $form_state['values']['loader_name']  ? $form_state['values']['loader_name']  : $loader_name;
  $remote_db    = $form_state['values']['remote_db']    ? $form_state['values']['remote_db']    : $remote_db;
  $disabled     = $form_state['values']['disabled']     ? $form_state['values']['disabled']     : $disabled;
  $do_contact   = $form_state['values']['do_contact']   ? $form_state['values']['do_contact']   : $do_contact;
  $days         = $form_state['values']['days']         ? $form_state['values']['days']         : $days;    
  
   
  // change the number of criteria based on form_state post data.
  if (!$num_criteria) {
    $num_criteria = 0;
  }
  if($form_state['post']["add-$num_criteria"]) {    
    $num_criteria++;
  }
  if($form_state['post']["remove-$num_criteria"]) {    
    $num_criteria--;
  }
  
  $form['pub_import_id'] = array(
    '#type'          => 'hidden',
    '#value'         => $pub_import_id,
    '#required'      => TRUE,
  );
  $form['action'] = array(
    '#type'          => 'hidden',
    '#value'         => $action,
    '#required'      => TRUE,
  );
  
  $form['loader_name'] = array(
    '#type'          => 'textfield',
    '#title'         => t('Loader Name'),
    '#description'   => t('Please provide a name for this loader setup..'),
    '#default_value' => $loader_name,
    '#required'      => TRUE,
  );
   
  $remote_dbs = array('PMID' => 'Pubmed');
  $form['remote_db'] = array(
    '#title' => t('Remote Database'),
    '#type' => 'select',
    '#options' => $remote_dbs,
    '#default_value' => $remote_db,
  );

  $form['num_criteria']= array(
    '#type'          => 'hidden',
    '#default_value' => $num_criteria,
  );
  $form['pub_import_id']= array(
    '#type'          => 'hidden',
    '#default_value' => $pub_import_id,
  );
  
  $form['days'] = array(
    '#type'          => 'textfield',
    '#title'         => t('Days'),
    '#description'   => t('The number of days from today to search.'),
    '#default_value' => $days,
    '#size'          => 5,
  );
  $form['disabled'] = array(
    '#type'          => 'checkbox',
    '#title'         => t('Disabled'),
    '#description'   => t('Check to disable this importer.'),
    '#default_value' => $disabled,
  );
  $form['do_contact'] = array(
    '#type'          => 'checkbox',
    '#title'         => t('Create Contact'),
    '#description'   => t('Check to create an entry in the contact table for each author of a matching publication during import. This allows storage of 
       additional information such as affilation, etc. Otherwise, only authors names are retrieved.'),
    '#default_value' => $do_contact,
  );
  
  for($i = 0; $i <= $num_criteria; $i++) {
    // if we have criteria supplied from the database then use that, othrewise look from the form_state or the session
    if ($criteria) {
      $search_terms = $criteria['criteria'][$i]['search_terms'];
      $scope = $criteria['criteria'][$i]['scope'];
      $operation = $criteria['criteria'][$i]['operation'];
    }
    // first populate defaults using any values in the SESSION variable
    $search_terms = $_SESSION['tripal_pub_search']['criteria'][$i]['search_terms'] ? $_SESSION['tripal_pub_search']['criteria'][$i]['search_terms'] : $search_terms;
    $scope        = $_SESSION['tripal_pub_search']['criteria'][$i]['scope']        ? $_SESSION['tripal_pub_search']['criteria'][$i]['scope']        : $scope;
    $operation    = $_SESSION['tripal_pub_search']['criteria'][$i]['operation']    ? $_SESSION['tripal_pub_search']['criteria'][$i]['operation']    : $operation;
    
    // next populate defaults using any form values
    $search_terms = $form_state['values']["search_terms-$i"] ? $form_state['values']["search_terms-$i"] : $search_terms;
    $scope        = $form_state['values']["scope-$i"]        ? $form_state['values']["scope-$i"]        : $scope;
    $operation    = $form_state['values']["operation-$i"]    ? $form_state['values']["operation-$i"]    : $operation;
    
    // default to searching the title and abstract
    if (!$scope) {
      $scope = 'abstract';
    }
  
    $form['criteria'][$i]["search_terms-$i"] = array(
      '#type'          => 'textfield',
      '#description'   => t('Please provide a list of words for searching. You may use conjunctions such as "AND" or "OR" to separate words if they are expected in the same scope"'),
      '#default_value' => $search_terms,
      '#required'      => TRUE,
    );
    $form['criteria'][$i]["scope-$i"] = array(
      '#type'          => 'select',
      '#description'   => t('Please select the fields to search for this term.'),
      '#options'       => array(
        'any'      => 'Any Field',
        'title'    => 'Title',
        'abstract' => 'Title/Abstract',
        'author'   => 'Author'),
      '#default_value' => $scope,
    );    
    
    if ($i > 0) {
      $form['criteria'][$i]["operation-$i"] = array(
        '#type'          => 'select',
        '#options'       => array(
          'AND' => 'AND',
          'OR'  => 'OR',
          'NOT' => 'NOT'),
        '#default_value' => $operation,
      );
    }
    if ($i == $num_criteria) {    
      if($i > 0) {
        $form['criteria'][$i]["remove-$i"] = array(
          '#type'         => 'image_button',
          '#value'        => t('Remove'),
          '#src'          => drupal_get_path('theme', 'tripal') . '/images/minus.png',
          '#ahah' => array(
            'path'    => "admin/tripal/tripal_pub/import/criteria/minus/$i",
            'wrapper' => 'tripal-pub-importer-setup-form',
            'event'   => 'click',
            'method'  => 'replace',
          ), 
          '#attributes' => array('onClick' => 'return false;'),
        );
      }
      $form['criteria'][$i]["add-$i"] = array(
        '#type'         => 'image_button',      
        '#value'        => t('Add'),
        '#src'          => drupal_get_path('theme', 'tripal') . '/images/add.png',
        '#ahah' => array(
          'path'    => "admin/tripal/tripal_pub/import/criteria/add/$i",
          'wrapper' => 'tripal-pub-importer-setup-form',
          'event'   => 'click',
          'method'  => 'replace',          
        ),   
        '#attributes' => array('onClick' => 'return false;'),
      );
    }
  }
  
  $form['test'] = array(
    '#type'         => 'submit',
    '#value'        => t('Test Importer'),
  );
  $form['save'] = array(
    '#type'         => 'submit',
    '#value'        => t('Save Importer'),
  );
  $form['delete'] = array(
    '#type'         => 'submit',
    '#value'        => t('Delete Importer'),
  );

  return $form;
}

/**
 *
 */
function tripal_pub_importer_setup_form_validate($form, &$form_state) {
  $num_criteria = $form_state['values']['num_criteria'];
  $remote_db =  $form_state['values']["remote_db"];
  $days =  trim($form_state['values']["days"]);
  $disabled =  $form_state['values']["disabled"];
  $do_contact =  $form_state['values']["do_contact"];
  $loader_name =  trim($form_state['values']["loader_name"]);

  for ($i = 0; $i <= $num_criteria; $i++) {            
    $search_terms =  trim($form_state['values']["search_terms-$i"]);
    $scope =  $form_state['values']["scope-$i"];
    $operation =  $form_state['values']["operation-$i"];
    
    if ($days and !is_numeric($days) or preg_match('/\./', $days)) {
      form_set_error("days-$i", "Please enter a numeric, non decimal value, for the number of days.");
    }
  }
}

/**
 *
 */
function tripal_pub_importer_setup_form_submit($form, &$form_state) {
   
  $pub_import_id = $form_state['values']['pub_import_id'];
  $num_criteria = $form_state['values']['num_criteria'];
  $remote_db =  $form_state['values']["remote_db"];
  $days =  trim($form_state['values']["days"]);
  $loader_name =  trim($form_state['values']["loader_name"]);
  $disabled =  $form_state['values']["disabled"];
  $do_contact =  $form_state['values']["do_contact"];

  // set the session variables
  $_SESSION['tripal_pub_search']['remote_db'] = $remote_db;
  $_SESSION['tripal_pub_search']['days'] = $days;
  $_SESSION['tripal_pub_search']['num_criteria'] = $num_criteria;
  $_SESSION['tripal_pub_search']['loader_name'] = $loader_name;
  $_SESSION['tripal_pub_search']['disabled'] = $disabled;
  $_SESSION['tripal_pub_search']['do_contact'] = $do_contact;
  unset($_SESSION['tripal_pub_search']['criteria']);
  for ($i = 0; $i <= $num_criteria; $i++) {
    $search_terms =  trim($form_state['values']["search_terms-$i"]);
    $scope =  $form_state['values']["scope-$i"];
    $operation =  $form_state['values']["operation-$i"];
    
    $_SESSION['tripal_pub_search']['criteria'][$i] = array(
      'search_terms' => $search_terms,
      'scope' => $scope,
      'operation' => $operation
    );
  }

  // now perform the appropriate action for the button clicked
  if ($form_state['values']['op'] == 'Test Importer') {
    $_SESSION['tripal_pub_search']['perform_search'] = 1;
  }
  if ($form_state['values']['op'] == 'Save Importer') {    
    $record = array(
      'name' => $loader_name,
      'criteria' => serialize($_SESSION['tripal_pub_search']),
      'disabled' => $disabled,
      'do_contact' => $do_contact
    );
    // first check to see if this pub_import_id is already present. If so,
    // do an update rather than an insert    
    $sql = "SELECT * FROM {tripal_pub_import} WHERE pub_import_id = %d";
    $importer = db_fetch_object(db_query($sql, $pub_import_id));
    if($importer) {
      // do the update
      $record['pub_import_id'] = $pub_import_id;
      if(drupal_write_record('tripal_pub_import', $record, 'pub_import_id')){
        unset($_SESSION['tripal_pub_search']);
        drupal_set_message('Publication import settings updated.');
        drupal_goto('admin/tripal/tripal_pub/import_list');       
      }
      else {
        drupal_set_message('Could not update publication import settings.', 'error');
      }
    }     
    else {         
      // do the insert        
      if(drupal_write_record('tripal_pub_import', $record)){
        unset($_SESSION['tripal_pub_search']);
        drupal_set_message('Publication import settings saved.');
        drupal_goto('admin/tripal/tripal_pub/import_list');
      }
      else {
        drupal_set_message('Could not save publication import settings.', 'error');
      }
    }    
  }
  if ($form_state['values']['op'] == 'Delete Importer') {
    $sql = "DELETE FROM {tripal_pub_import} WHERE pub_import_id = %d";
    $success = db_query($sql, $pub_import_id);
    if ($success) {
      drupal_set_message('Publication importer deleted.');
      drupal_goto('admin/tripal/tripal_pub/import_list');  
    }
    else {
      drupal_set_message('Could not delete publication importer.', 'error');
    }
  }  
}

/*
 * 
 */
function tripal_pub_importer_delete($pub_import_id) {
  $sql = "DELETE FROM {tripal_pub_import} WHERE pub_import_id = %d";
  $success = db_query($sql, $pub_import_id);
  if ($success) {
    drupal_set_message('Publication importer deleted.');
    drupal_goto('admin/tripal/tripal_pub/import_list');  
  }
  else {
    drupal_set_message('Could not delete publication importer.', 'error');
  }
}
/*
 * AHAH callback
 */
function tripal_pub_importer_setup_page_update_criteria($action, $i) {
  $status = TRUE;

  // prepare and render the form
  $form = tripal_core_ahah_prepare_form();   
  $data = theme('tripal_pub_importer_setup_form', $form);  

  // bind javascript events to the new objects that will be returned 
  // so that AHAH enabled elements will work.
  $settings = tripal_core_ahah_bind_events();

  // return the updated JSON
  drupal_json(
    array(
      'status'   => $status, 
      'data'     => $data,
      'settings' => $settings,
    )  
  );
}