<?php
/**
 * @file
 * Handles installation of the feature map module
 */

/**
 * Implements hook_disable().
 * Disable default views when module is disabled
 *
 * @ingroup tripal_featuremap
 */
function tripal_featuremap_disable() {

  // Disable all default views provided by this module
  require_once("tripal_featuremap.views_default.inc");
  $views = tripal_featuremap_views_default_views();
  foreach (array_keys($views) as $view_name) {
    tripal_disable_view($view_name,FALSE,array('suppress_error' => TRUE));
  }

}

/**
 * Implementation of hook_requirements().
 *
 * @ingroup tripal_featuremap
 */
function tripal_featuremap_requirements($phase) {
  $requirements = array();
  if ($phase == 'install') {
    // make sure chado is installed
    if (!$GLOBALS["chado_is_installed"]) {
      $requirements ['tripal_featuremap'] = array(
        'title' => "tripal_featuremap",
        'value' => "ERROR: Chado most be installed before this module can be enabled",
        'severity' => REQUIREMENT_ERROR,
      );
    }
  }
  return $requirements;
}

/**
 * Implementation of hook_install().
 *
 * @ingroup tripal_featuremap
 */
function tripal_featuremap_install() {

  // add the featuremapprop table to Chado
  tripal_featuremap_add_custom_tables();

  // Add cvterms
  tripal_featuremap_add_cvs();
  tripal_featuremap_add_cvterms();

  // set the default vocabularies
  tripal_set_default_cv('featuremapprop', 'type_id', 'featuremap_property');
  tripal_set_default_cv('featureposprop', 'type_id', 'featurepos_property');
  tripal_set_default_cv('featuremap', 'unittype_id', 'featuremap_units');
}

/**
 * Implementation of hook_uninstall().
 *
 * @ingroup tripal_featuremap
 */
function tripal_featuremap_uninstall() {

}

/**
 * Implementation of hook_schema().
 *
 * @ingroup tripal_featuremap
 */
function tripal_featuremap_schema() {
  $schema['chado_featuremap'] = array(
    'fields' => array(
      'vid' => array(
        'type' => 'int',
        'unsigned' => TRUE,
        'not null' => TRUE,
        'default' => 0
      ),
      'nid' => array(
        'type' => 'int',
        'unsigned' => TRUE,
        'not null' => TRUE,
        'default' => 0
      ),
      'featuremap_id' => array(
        'type' => 'int',
        'not null' => TRUE,
        'default' => 0
        )
      ),
      'indexes' => array(
        'featuremap_id' => array('featuremap_id')
      ),
      'unique keys' => array(
        'nid_vid' => array('nid', 'vid'),
        'vid' => array('vid')
      ),
      'primary key' => array('nid'),
  );
  return $schema;
}

/**
 * Add cvs needed by the featuremap module
 *
 * @ingroup tripal_featuremap
 */
function tripal_featuremap_add_cvs() {

  tripal_insert_cv(
    'featuremap_units',
    'Contains map unit types for the unittype_id column of the featuremap table.'
  );

  tripal_insert_cv(
    'featurepos_property',
    'Contains terms map properties.'
  );

  tripal_insert_cv(
    'featuremap_property',
    'Contains positional types for the feature positions'
  );
}

/**
 * Add cv terms needed by the featuremap module
 *
 * @ingroup tripal_featuremap
 */
function tripal_featuremap_add_cvterms() {

   // add cvterms for the map unit types
   tripal_insert_cvterm(
     array(
       'name' => 'cM',
       'definition' => 'Centimorgan units',
       'cv_name' => 'featuremap_units',
       'is_relationship' => 0,
       'db_name' => 'tripal'
      ),
      array('update_existing' => TRUE)
   );
   tripal_insert_cvterm(
     array(
       'name' => 'bp',
       'definition' => 'Base pairs units',
       'cv_name' => 'featuremap_units',
       'is_relationship' => 0,
       'db_name' => 'tripal'
      ),
      array('update_existing' => TRUE)
   );
   tripal_insert_cvterm(
     array(
       'name' => 'bin_unit',
       'definition' => 'The bin unit',
       'cv_name' => 'featuremap_units',
       'is_relationship' => 0,
       'db_name' => 'tripal'
      ),
      array('update_existing' => TRUE)
   );
   tripal_insert_cvterm(
     array(
       'name' => 'marker_order',
       'definition' => 'Units simply to define marker order.',
       'cv_name' => 'featuremap_units',
       'is_relationship' => 0,
       'db_name' => 'tripal'
      ),
      array('update_existing' => TRUE)
   );
   tripal_insert_cvterm(
     array(
       'name' => 'undefined',
       'definition' => 'A catch-all for an undefined unit type',
       'cv_name' => 'featuremap_units',
       'is_relationship' => 0,
       'db_name' => 'tripal'
      ),
      array('update_existing' => TRUE)
   );

   // featurepos properties
   tripal_insert_cvterm(
     array(
       'name' => 'start',
       'definition' => 'The start coordinate for a map feature.',
       'cv_name' => 'featurepos_property',
       'is_relationship' => 0,
       'db_name' => 'tripal'
      ),
      array('update_existing' => TRUE)
   );
   tripal_insert_cvterm(
     array(
       'name' => 'stop',
       'definition' => 'The end coordinate for a map feature',
       'cv_name' => 'featurepos_property',
       'is_relationship' => 0,
       'db_name' => 'tripal'
      ),
      array('update_existing' => TRUE)
   );

   // add cvterms for map properties
   tripal_insert_cvterm(
     array(
       'name' => 'Map Dbxref',
       'definition' => 'A unique identifer for the map in a remote database.  The '
        . 'format is a database abbreviation and a unique accession separated '
        . 'by a colon.  (e.g. Gramene:tsh1996a)',
       'cv_name' => 'featuremap_property',
       'is_relationship' => 0,
       'db_name' => 'tripal'
      ),
      array('update_existing' => TRUE)
   );
   tripal_insert_cvterm(
     array(
       'name' => 'Map Type',
       'definition' => 'The type of Map (e.g. QTL, Physical, etc.)',
       'cv_name' => 'featuremap_property',
       'is_relationship' => 0,
       'db_name' => 'tripal'
      ),
      array('update_existing' => TRUE)
   );
   tripal_insert_cvterm(
     array(
       'name' => 'Genome Group',
       'definition' => '',
       'cv_name' => 'featuremap_property',
       'is_relationship' => 0,
       'db_name' => 'tripal'
      ),
      array('update_existing' => TRUE)
   );
   tripal_insert_cvterm(
     array(
       'name' => 'URL',
       'definition' => 'A univeral resource locator (URL) reference where the '
        . 'publication can be found.  For maps found online, this would be '
        . 'the web address for the map.',
       'cv_name' => 'featuremap_property',
       'is_relationship' => 0,
       'db_name' => 'tripal'
      ),
      array('update_existing' => TRUE)
   );
   tripal_insert_cvterm(
     array(
       'name' => 'Population Type',
       'definition' => 'A brief description of the population type used to generate '
        . 'the map (e.g. RIL, F2, BC1, etc).',
       'cv_name' => 'featuremap_property',
       'is_relationship' => 0,
       'db_name' => 'tripal'
      ),
      array('update_existing' => TRUE)
   );
   tripal_insert_cvterm(
     array(
       'name' => 'Population Size',
       'definition' => 'The size of the population used to construct the map.',
       'cv_name' => 'featuremap_property',
       'is_relationship' => 0,
       'db_name' => 'tripal'
      ),
      array('update_existing' => TRUE)
   );
   tripal_insert_cvterm(
     array(
       'name' => 'Methods',
       'definition' => 'A brief description of the methods used to construct the map.',
       'cv_name' => 'featuremap_property',
       'is_relationship' => 0,
       'db_name' => 'tripal'
      ),
      array('update_existing' => TRUE)
   );
   tripal_insert_cvterm(
     array(
       'name' => 'Software',
       'definition' => 'The software used to construct the map.',
       'cv_name' => 'featuremap_property',
       'is_relationship' => 0,
       'db_name' => 'tripal'
      ),
      array('update_existing' => TRUE)
    );

}

/**
 * Add custom tables needed by the feature map module
 *  - featuremapprop
 *  - featuremap_dbxref
 *  - featureposprop
 *
 * @ingroup tripal_featuremap
 */
// This function was moved to tripal_chado/includes/setup/tripal_chado.setup.inc
/* function tripal_featuremap_add_custom_tables(){
  // add the featuremaprop table to Chado
  $schema = array (
    'table' => 'featuremapprop',
    'fields' => array (
      'featuremapprop_id' => array (
        'type' => 'serial',
        'not null' => true,
      ),
      'featuremap_id' => array (
        'type' => 'int',
        'not null' => true,
      ),
      'type_id' => array (
        'type' => 'int',
        'not null' => true,
      ),
      'value' => array (
        'type' => 'text',
        'not null' => false,
      ),
      'rank' => array (
        'type' => 'int',
        'not null' => true,
        'default' => 0,
      ),
    ),
    'primary key' => array (
      0 => 'featuremapprop_id',
    ),
    'unique keys' => array (
      'featuremapprop_c1' => array (
        0 => 'featuremap_id',
        1 => 'type_id',
        2 => 'rank',
      ),
    ),
    'indexes' => array (
      'featuremapprop_idx1' => array (
        0 => 'featuremap_id',
      ),
      'featuremapprop_idx2' => array (
        0 => 'type_id',
      ),
    ),
    'foreign keys' => array (
      'cvterm' => array (
        'table' => 'cvterm',
        'columns' => array (
          'type_id' => 'cvterm_id',
        ),
      ),
      'featuremap' => array (
        'table' => 'featuremap',
        'columns' => array (
          'featuremap_id' => 'featuremap_id',
        ),
      ),
    ),
  );
  chado_create_custom_table('featuremapprop', $schema, TRUE);

  // add the featuremap_dbxref table to Chado
  $schema = array (
    'table' => 'featuremap_dbxref',
    'fields' => array (
      'featuremap_dbxref_id' => array (
        'type' => 'serial',
        'not null' => true,
      ),
      'featuremap_id' => array (
        'type' => 'int',
        'not null' => true,
      ),
      'dbxref_id' => array (
        'type' => 'int',
        'not null' => true,
      ),
    ),
    'primary key' => array (
      0 => 'featuremap_dbxref_id',
    ),
    'unique keys' => array (
      'featuremap_dbxref_c1' => array (
        0 => 'featuremap_id',
        1 => 'dbxref_id',
      ),
    ),
    'indexes' => array (
      'featuremap_dbxref_idx1' => array (
        0 => 'featuremap_dbxref_id',
      ),
      'featuremap_dbxref_idx2' => array (
        0 => 'dbxref_id',
      ),
    ),
    'foreign keys' => array (
      'dbxref' => array (
        'table' => 'dbxref',
        'columns' => array (
          'dbxref_id' => 'dbxref_id',
        ),
      ),
      'featuremap' => array (
        'table' => 'featuremap',
        'columns' => array (
          'featuremap_id' => 'featuremap_id',
        ),
      ),
    ),
    'referring_tables' => NULL,
  );
  chado_create_custom_table('featuremap_dbxref', $schema, TRUE);

  $schema = array (
    'table' => 'featureposprop',
    'fields' => array (
      'featureposprop_id' => array (
        'type' => 'serial',
        'not null' => true,
      ),
      'featurepos_id' => array (
        'type' => 'int',
        'not null' => true,
      ),
      'type_id' => array (
        'type' => 'int',
        'not null' => true,
      ),
      'value' => array (
        'type' => 'text',
        'not null' => false,
      ),
      'rank' => array (
        'type' => 'int',
        'not null' => true,
        'default' => 0,
      ),
    ),
    'primary key' => array (
      0 => 'featureposprop_id',
    ),
    'unique keys' => array (
      'featureposprop_id' => array (
        0 => 'featurepos_id',
        1 => 'type_id',
        2 => 'rank',
      ),
    ),
    'indexes' => array (
      'featureposprop_c1' => array (
        0 => 'featurepos_id',
      ),
      'featureposprop_idx2' => array (
        0 => 'type_id',
      ),
    ),
    'foreign keys' => array (
      'cvterm' => array (
        'table' => 'cvterm',
        'columns' => array (
          'type_id' => 'cvterm_id',
        ),
      ),
      'featurepos' => array (
        'table' => 'featurepos',
        'columns' => array (
          'featurepos_id' => 'featurepos_id',
        ),
      ),
    ),
  );
  chado_create_custom_table('featureposprop', $schema, TRUE);
} */