#####################################################################
#!/usr/local/bin/perl -w
# Mode: perl
# Programmer: Kuan Chang
# Date: 04/22/2001
#####################################################################

use strict;
use POSIX('ceil');
use CGI qw(:standard *table *TR *th *td *ul *ol);
use Gramene::Mutant::MutantSearchDB;
use Gramene::Page;

#####################################################################
# constants

use constant GO_PREFIX => 'GO:';
use constant TO_PREFIX => 'TO:';
# GR_PREFIX is for mutant
use constant GR_PREFIX => 'GR:';
use constant STUDY_PREFIX => 'GR:ST:';
use constant ALLELE_PREFIX => 'GR:AL:';
use constant GERMPLASM_PREFIX => 'GR:GP:';
use constant MAX_LENGTH_OF_ACCESSION => 7;
use constant EXE_NAME => 'search_mutant';
use constant ALLELE_EXE_NAME => 'search_allele';
use constant ONTOLOGY_HOME => '/db/ontology/';
use constant ONTOLOGY_EXE_NAME => 'search_term';
use constant STUDY_EXE_NAME => 'search_study';
use constant SEARCH_PROTEIN_EXE_NAME => 'protein_search';
use constant MUTANT_IMAGE_HOME => '/images/mutant/';
use constant CORNELL_RFLP_2001 => 3;
use constant JRGP_2000 => 6;
#this is for raclette 
use constant RICE_MORPHOLOGICAL_MAP_2000 => 8;

# my $CORNELL_RFLP_2001 = 1;
# my $JRGP_2000 = 2;
# my $RICE_MORPHOLOGICAL_MAP_2000 = 4;

#####################################################################
# Connect to the database
my $db = Gramene::Mutant::MutantSearchDB->new();
$db->connect_db();
my $page = Gramene::Page->new(Apache->request);

my $input  = param('id');
my ($id, $is_germplasm);
undef $id;
($id, $is_germplasm) = extract_ID(GERMPLASM_PREFIX, $input);

# create CGI object
my $cgi = new CGI;
print $cgi->header;

if(defined $id && $is_germplasm){
  my $germplasm = $db->get_germplasm($id);
   
  my ($germplasm_info_id, $germplasm_accession, $geographical_location_id, $mutagenesis_id, $germplasm_wild_type, $genus, $species_id, $subspecies_id) =split(/\t/,$germplasm) if $germplasm;

 # $study_type = $db->get_germplasm_study_type($id)  if $germplasm;
  my $germplasm_location = $db->get_germplasm_location($id) if $germplasm ;
  my ($mutagen, $mutagenesis_method) = $db->get_germplasm_mutagenesis($id) if $germplasm;
  my @germplasm_to_mutants =$db->get_germplasm_to_objects($id,'mutant') if $germplasm ;
  my @germplasm_to_alleles =$db->get_germplasm_to_objects($id,'allele') if $germplasm ;
   
  #check if parameters are empty, set them undefined
  undef $germplasm_accession unless $germplasm_accession;
  undef $germplasm_location unless $germplasm_location;
  undef $germplasm_wild_type unless $germplasm_wild_type;
  undef $mutagen unless $mutagen;
  undef $mutagenesis_method unless $mutagenesis_method;
#  undef $germplasm_name unless $germplasm_name;
#  undef $germplasm_background unless $germplasm_background;
#  undef $study_type unless $study_type;
  undef @germplasm_to_mutants unless @germplasm_to_mutants;
  undef @germplasm_to_alleles unless @germplasm_to_alleles;
#######################################################################
  if(defined $germplasm) {
    print $page->start_html(-title=>"Summary for Rice Germplasm: $germplasm_accession"); 
  }
  else{
    print $page->start_html(-title=>"Cannot find any information about $input"); 
  }

  print $page->start_body;

  # show Gramene search engine
  print_mutant_search_area();

  # show study page
  if(defined $germplasm) {
    print h1("Summary for Rice Germplasm: <i>$germplasm_accession</i>");
    print start_table({-width=>'98%', -align=>'center', -cellpadding=>4, -cellspacing=>1});
   #if($germplasm_name && $germplasm_name ne 'NA'){
   #  print TR(th({-align=>'left', -class=>'datatitle', -width=>'20%'}, 'Germplasm Name'), td({-colspan=>4,-class=>'databody'}, $germplasm_name));
    #}    
    print TR(th({-align=>'left', -class=>'datatitle', -width=>'20%'}, 'Germplasm Accession'), td({-colspan=>4,-class=>'databody'}, $germplasm_accession));
    print TR(th({-align=>'left', -class=>'datatitle', -width=>'20%'}, 'Location'), td({-colspan=>4,-class=>'databody'}, $germplasm_location));
    print TR(th({-align=>'left', -class=>'datatitle', -width=>'20%'}, 'Wild Type'), td({-colspan=>4,-class=>'databody'}, $germplasm_wild_type)) if ($germplasm_wild_type);
    print TR(th({-align=>'left', -class=>'datatitle', -width=>'20%'}, 'Mutagen'), td({-colspan=>4,-class=>'databody'}, $mutagen));
    print TR(th({-align=>'left', -class=>'datatitle', -width=>'20%'}, 'Mutagenesis Method'), td({-colspan=>4,-class=>'databody'}, $mutagenesis_method));
   # print TR(th({-align=>'left', -class=>'datatitle', -width=>'20%'}, 'Study type'), td({-colspan=>4,-class=>'databody'}, $study_type)) if ($study_type);
   #  print TR(th({-align=>'left', -class=>'datatitle', -width=>'20%'}, 'Genetic background'), td({-colspan=>4,-class=>'databody'}, $germplasm_background)) if($germplasm_background);

     if(@germplasm_to_alleles){
        my $total=@germplasm_to_alleles;
        my $row=ceil($total/3);
        print start_TR;
        print th({-align=>'left', -class=>'datatitle',
	-width=>'20%',-rowspan=>$row}, 'Allele');
        my $i=0;
        for(;$i<$total && $i!=3;$i++){
           
	   my $allele_id=$germplasm_to_alleles[$i];	
	   my $allele = $db->get_allele($allele_id);
	   my($db_allele_id, $allele_name, $allele_description, $allele_interaction_description) = split(/\t/,$allele) if $allele;
	   my $allele_accession = get_canonical_accession(ALLELE_PREFIX,$db_allele_id);
           if($allele_name eq 'NA'){
	      print td({-class=>'databody', -align=>'left'}, $i+1, '.',
	      a({-target=>"allele",-href=>ALLELE_EXE_NAME ."?id=$allele_accession"}, $allele_accession));
	   }else {
	     print td({-class=>'databody', -align=>'left'}, $i+1, '.',
	     a({-target=>"allele",-href=>ALLELE_EXE_NAME ."?id=$allele_accession"}, $allele_name));
            }
                     
         }
         print end_TR;
        
         for(;$i<$total;$i++){
            print start_TR if ($i%3==0);
            
	    my $allele_id=$germplasm_to_alleles[$i];	
	    my $allele = $db->get_allele($allele_id);
	    my($db_allele_id, $allele_name, $allele_description, $allele_interaction_description) = split(/\t/,$allele) if $allele;
	    my $allele_accession = get_canonical_accession(ALLELE_PREFIX,$db_allele_id);
            if($allele_name eq 'NA'){
	      print td({-class=>'databody', -align=>'left'}, $i+1, '.',
	      a({-target=>"allele",-href=>ALLELE_EXE_NAME ."?id=$allele_accession"}, $allele_accession));
	    }else {
	     print td({-class=>'databody', -align=>'left'}, $i+1, '.',
	     a({-target=>"allele",-href=>ALLELE_EXE_NAME ."?id=$allele_accession"}, $allele_name));
            }
            if($i==$total-1){  # for filling the empty space
                my $remain=3-$i%3;
                print td({-class=>'databody', -align=>'left',-colspan=>$remain},' ') if($remain !=1);
            }
            print end_TR if($i==$total-1 || ($i+1)%3==0);
         }
     
    }
   
     if(@germplasm_to_mutants){
        my $total=@germplasm_to_mutants;
        my $row=ceil($total/3);
        print start_TR;
        print th({-align=>'left', -class=>'datatitle', -width=>'20%',-rowspan=>$row}, 'Gene');
        my $i=0;
        for(;$i<$total && $i!=3;$i++){
           
           my $mutant_id=$germplasm_to_mutants[$i];
           my $mutant_name = $db->get_mutant_name($mutant_id);
	   my $mutant_accession = get_canonical_accession(GR_PREFIX, $mutant_id);
           if($mutant_name eq 'NA'){
	      print td({-class=>'databody', -align=>'left'}, $i+1, '.', a({-target=>"mutant",-href=>EXE_NAME ."?id=$mutant_accession"}, $mutant_accession));
	   }else {
	     print td({-class=>'databody', -align=>'left'}, $i+1, '.', a({-target=>"mutant",-href=>EXE_NAME ."?id=$mutant_accession"}, $mutant_name));
            }
                     
         }
         print end_TR;
        
         for(;$i<$total;$i++){
            print start_TR if ($i%3==0);
                
            my $mutant_id=$germplasm_to_mutants[$i];	
	    my $mutant_name = $db->get_mutant_name($mutant_id);
	    my $mutant_accession = get_canonical_accession(GR_PREFIX, $mutant_id);
            if($mutant_name eq 'NA'){
	      print td({-class=>'databody', -align=>'left'}, $i+1, '.', a({-target=>"mutant",-href=>EXE_NAME ."?id=$mutant_accession"}, $mutant_accession));
	    }else {
	      print td({-class=>'databody', -align=>'left'}, $i+1, '.', a({-target=>"mutant",-href=>EXE_NAME ."?id=$mutant_accession"}, $mutant_name));
	    }
            if($i==$total-1){  # for filling the empty space
                my $remain=3-$i%3;
                print td({-class=>'databody', -align=>'left',-colspan=>$remain},' ') if($remain !=1);
            }
            print end_TR if($i==$total-1 || ($i+1)%3==0);
         }
     
    }
    print end_table;
  }
  else{
    print h1("Sorry! Cannot find any information about <i>$input</i>");
  }

  print $page->end_body;
}
else{
  #default for no data available
  print $cgi->start_html(-title=>"Cannot find any information about $input", 
		         -style=>{'src'=>'/stylesheets/gramene.css'});
  #show Gramene::Page header
  print header();
  print $page->start_body;
  print_mutant_search_area();  
  print h1("Sorry! Cannot find any information about <i>$input</i>"); 
  print $page->end_body;
}

#####################################################################
# utility functions
#####################################################################
sub extract_ID{
  my ($prefix, $id) = @_;
  my $is_target = 0;
  
  if($id =~ /$prefix/) {
    $id =~ s/$prefix//;
    $is_target = 1;
  } 
  undef $id unless(is_digit($id));
  
  return ($id, $is_target);
}

sub is_digit{
  my $query = shift;
  $query =~ s/^\s+//;
  $query =~ s/\s+$//;
  if ($query =~ /^\d+$/ ){
    return 1;
  }else{ 
    return 0;
  }
}

sub get_canonical_accession{
  my ($prefix, $id) = @_;
  my $canonical_accession = $prefix;
  my $length = MAX_LENGTH_OF_ACCESSION - length($id);
  for my $x (1 .. $length){
    $canonical_accession .= "0";
  }
  $canonical_accession .= $id;
  return $canonical_accession;
}

sub remove_spaces_on_both_sides{
  my $query = shift;
  $query =~ s/^\s+//;
  $query =~ s/\s+$//;
  return $query;
}

#################
sub print_mutant_search_area {
    my $self = url(-relative=>1);
    print start_form(-method=>'GET', -action=>"search_core");


  print <<SEARCH_AREA;
&nbsp;<img src="/images/icons/grain_icon.jpg" alt="grain_icon" height="16" width="16">
<a href="/rice_mutant/index.html" class="gopage">Gene Home</a> |
<a href="/rice_mutant/gene_search.html" class="gopage">Search</a> |
<a href="/rice_mutant/gene_submit.html" class="gopage">Submit</a> |
<a href="/rice_mutant/gene_help.html" class="gopage">Help Documents</a> |
<a href="/tutorials/mutant.html" class="gopage">Tutorial</a> |
<a href="/documentation/faq/mut_faq.html" class="gopage">FAQ</a>
<p></p>
<table align="center" cellspacing="0" cellpadding="3" border="0" width="98%" align=center>
  <tr><th align=center class=searchtitle>Gene Search</th></tr>
  <tr align=center class=searchbody>
    <td align=center>&nbsp;&nbsp;&nbsp;&nbsp;<input type=text value="" framewidth=4 name=query size=40 maxlength=256>&nbsp;&nbsp;&nbsp;&nbsp;<input name=btn type=submit value="Search">&nbsp;&nbsp;<input name=Clear type=reset value="Clear">
      <br><span class="alert">Search by Gene Symbol, Gene Name, Gramene Accesssion&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>[e.g. <a href="/db/mutant/search_mutant?id=GR:0060198">dwarf-15</a> or <a href="/db/mutant/search_mutant?id=GR:0060198">GR:0060198</a>]&nbsp;&nbsp;<a href="/rice_mutant/Mutant_Help1.html">HELP</a> 
    </td>
  </tr>
</table>
SEARCH_AREA

    print end_form();
    print "<hr>";
}
