<?php
/* Typically in a Tripal template, the data needed is retrieved using a call to
 * chado_expand_var function.  For example, to retrieve all
 * of the feature relationships for this node, the following function call would
 * be made:
 *
 *   $feature = chado_expand_var($feature,'table','feature_relationship');
 *
 * However, this function call can be extremely slow when there are numerous
 * relationships. This is because the chado_expand_var function is recursive
 * and expands all data following the foreign key relationships tree.
 * Therefore, to speed retrieval of data, a special variable is provided to
 * this template:
 *
 *   $feature->all_relationships;
 *
 * This variable is an array with two sub arrays with the keys 'object' and
 * 'subject'.  The array with key 'object' contains relationships where the
 * feature is the object, and the array with the key 'subject' contains
 * relationships where the feature is the subject
 */
$feature = $variables['node']->feature;

$all_relationships = $feature->all_relationships;
$object_rels = $all_relationships['object'];
$subject_rels = $all_relationships['subject'];

if (count($object_rels) > 0 or count($subject_rels) > 0) { ?>
  <div class="tripal_feature-data-block-desc tripal-data-block-desc"></div> <?php

  // first add in the subject relationships.
  foreach ($subject_rels as $rel_type => $rels){
    foreach ($rels as $obj_type => $objects){

      // Make the verb in the sentence make sense in English.
      switch ($rel_type) {
        case 'integral part of':
        case 'instance of':
          $verb = 'is an';
          break;
        case 'proper part of':
        case 'transformation of':
        case 'genome of':
        case 'part of':
        case 'position of':
        case 'sequence of':
        case 'variant of':
          $verb = 'is a';
          break;
        case 'derives from':
        case 'connects on':
        case 'contains':
        case 'finishes':
        case 'guides':
        case 'has origin':
        case 'has part':
        case 'has quality':
        case 'is consecutive sequence of':
        case 'maximally overlaps':
        case 'overlaps':
        case 'starts':
          $verb = '';
          break;
        default:
          $verb = 'is';
      } ?>

      <p>This <?php print $feature->type_id->name;?> <?php print $verb ?> <?php print $rel_type ?> the following <b><?php print $obj_type ?></b> feature(s): <?php

      // the $headers array is an array of fields to use as the colum headers.
      // additional documentation can be found here
      // https://api.drupal.org/api/drupal/includes%21theme.inc/function/theme_table/7
      $headers = array('Feature Name' ,'Unique Name', 'Species', 'Type', 'Position');

      // the $rows array contains an array of rows where each row is an array
      // of values for each column of the table in that row.  Additional documentation
      // can be found here:
      // https://api.drupal.org/api/drupal/includes%21theme.inc/function/theme_table/7
      $rows = array();

      foreach ($objects as $object){
        // link the feature to it's node
        $feature_name = $object->record->object_id->name;
        if (property_exists($object->record, 'nid')) {
          $feature_name = l($feature_name, "node/" . $object->record->nid, array('attributes' => array('target' => "_blank")));
        }
        // link the organism to it's node
        $organism = $object->record->object_id->organism_id;
        $organism_name = $organism->genus ." " . $organism->species;
        if (property_exists($organism, 'nid')) {
          $organism_name = l("<i>" . $organism->genus . " " . $organism->species . "</i>", "node/" . $organism->nid, array('html' => TRUE));
        }

        $location = '?';
        if (isset($object->parent_featurelocs[0])) {
            $loc = $object->parent_featurelocs[0];
            $location = $loc->srcfeature_name.' '. ($loc->fmin + 1) . ".." . $loc->fmax . " " . ($loc->strand == -1 ? '-' : '+');
        }
        $rows[] = array(
          array('data' => $feature_name, 'width' => '28%'),
          array('data' => $object->record->object_id->uniquename, 'width' => '25%'),
          array('data' => $organism_name, 'width' => '25%'),
          array('data' => $object->record->object_id->type_id->name, 'width' => '12%'),
          array('data' => $location, 'width' => '12%'),
        );
       }
       // the $table array contains the headers and rows array as well as other
       // options for controlling the display of the table.  Additional
       // documentation can be found here:
       // https://api.drupal.org/api/drupal/includes%21theme.inc/function/theme_table/7
       $table = array(
         'header' => $headers,
         'rows' => $rows,
         'attributes' => array(
           'id' => 'tripal_feature-table-relationship-object',
           'class' => 'tripal-data-table'
         ),
         'sticky' => FALSE,
         'caption' => '',
         'colgroups' => array(),
         'empty' => '',
       );

       // once we have our table array structure defined, we call Drupal's theme_table()
       // function to generate the table.
       print theme_table($table); ?>
       </p>
       <br><?php
     }
  }

  // second add in the object relationships.
  foreach ($object_rels as $rel_type => $rels){
    foreach ($rels as $subject_type => $subjects){

      // Make the verb in the sentence make sense in English.
      switch ($rel_type) {
        case 'integral part of':
        case 'instance of':
          $verb = 'are an';
          break;
        case 'proper part of':
        case 'transformation of':
        case 'genome of':
        case 'part of':
        case 'position of':
        case 'sequence of':
        case 'variant of':
          $verb = 'are a';
          break;
        case 'derives from':
        case 'connects on':
        case 'contains':
        case 'finishes':
        case 'guides':
        case 'has origin':
        case 'has part':
        case 'has quality':
        case 'is consecutive sequence of':
        case 'maximally overlaps':
        case 'overlaps':
        case 'starts':
          $verb = '';
          break;
        default:
          $verb = 'are';
      } ?>
      <p>The following <b><?php print $subjects[0]->record->subject_id->type_id->name ?></b> feature(s) <?php print $verb ?> <?php print $rel_type ?> this <?php print $feature->type_id->name;?>: <?php
      // the $headers array is an array of fields to use as the colum headers.
      // additional documentation can be found here
      // https://api.drupal.org/api/drupal/includes%21theme.inc/function/theme_table/7
      $headers = array('Feature Name' ,'Unique Name', 'Species', 'Type', 'Position');

      // the $rows array contains an array of rows where each row is an array
      // of values for each column of the table in that row.  Additional documentation
      // can be found here:
      // https://api.drupal.org/api/drupal/includes%21theme.inc/function/theme_table/7
      $rows = array();

      foreach ($subjects as $subject){
        // link the feature to it's node
        $feature_name = $subject->record->subject_id->name;
        if (property_exists($subject->record, 'nid')) {
          $feature_name = l($feature_name, "node/" . $subject->record->nid, array('attributes' => array('target' => "_blank")));
        }
        // link the organism to it's node
        $organism = $subject->record->subject_id->organism_id;
        $organism_name = $organism->genus ." " . $organism->species;
        if (property_exists($organism, 'nid')) {
          $organism_name = l("<i>" . $organism->genus . " " . $organism->species . "</i>", "node/" . $organism->nid, array('html' => TRUE));
        }

        $location = '?';
        if (isset($subject->child_featurelocs[0])) {
            $loc = $subject->child_featurelocs[0];
            $location = $loc->srcfeature_name.' '. ($loc->fmin + 1) . ".." . $loc->fmax . " " . ($loc->strand == -1 ? '-' : '+');
        }
        $rows[] = array(
          array('data' => $feature_name, 'width' => '28%'),
          array('data' =>$subject->record->subject_id->uniquename, 'width' => '25%'),
          array('data' =>$organism_name, 'width' => '25%'),
          array('data' =>$subject->record->subject_id->type_id->name, 'width' => '12%'),
          array('data' => $location, 'width' => '12%'),
        );
       }
       // the $table array contains the headers and rows array as well as other
       // options for controlling the display of the table.  Additional
       // documentation can be found here:
       // https://api.drupal.org/api/drupal/includes%21theme.inc/function/theme_table/7
       $table = array(
         'header' => $headers,
         'rows' => $rows,
         'attributes' => array(
           'id' => 'tripal_feature-table-relationship-subject',
           'class' => 'tripal-data-table'
         ),
         'sticky' => FALSE,
         'caption' => '',
         'colgroups' => array(),
         'empty' => '',
       );

       // once we have our table array structure defined, we call Drupal's theme_table()
       // function to generate the table.
       print theme_table($table); ?>
       </p>
       <br><?php
     }
  }
}