#!/usr/local/bin/perl -w

use strict;
use Apache::Request;
use Template;

use Gramene::Page;
use Gramene::Utils 'commify';
use Gramene::Mutant::MutantDB;



use constant DETAIL_TEMPLATE    => 'mutant_detail.tmpl';
use constant DISPLAY_TEMPLATE   => 'mutant_display.tmpl';
use constant ERROR_TEMPLATE     => 'mutant_error.tmpl';
use constant SEARCH_TEMPLATE    => 'mutant_search.tmpl';
use constant PAGE_SIZE       => 25;
use constant MAX_PAGES       => 10;



my $apr  = Apache::Request->new(Apache->request);
my $page = Gramene::Page->new($apr);
my ($template, $html,$db,$pager);



my %args = $apr->args;        


eval{

 $template = Template->new({ 
        INCLUDE_PATH => '/usr/local/gramene/templates/mutant', 
        PRE_CHOMP  => 1,
	POST_CHOMP => 1,
        TRIM => 1,
        FILTERS      => { commify  => \&Gramene::Utils::commify }
              
       }); 

 $db = Gramene::Mutant::MutantDB->new();
 $db->connect_to_db();

 
 my $all_species = $db->get_all_species();



 # for mutant search 
 my $query_submit = $apr->param('query_submit');
 my $order_by = $apr->param('order_by') || 'gene_symbol';
 my $page_no          = $apr->param('page_no')     ||  1;
  
 my ($query,$search_field,$species);


 # for mutant gene detail display
 my $acc = $apr->param('acc');

 
 my @gene_objs; # for candidate genes by search
 my @term_objs; # for ontology term keyword search;
 my $term_search; # internal search,exactly term association,the keyword is a term 
 
 my $gene_obj;  # for gene detail



 if($query_submit){  # search 
     $query = $apr->param('query');
     $search_field = $apr->param('search_field');
     $species = $apr->param('species');
     my $term_acc = $apr->param('term_acc');

     $query =~s/^\s+|\s+$//g;

   #  my @fields=qw[gene_symbol gene_name chromosome accession];
     my @fields=qw[chromosome accession];
     my %simple_fields = map {$_,1} @fields;
    
     my %seq_fields = (
                        'seq_gene'=>'GenBank.Nucleotide',
                        'seq_protein'=>'Gramene.Protein'
       		      );
     my %ontology_fields = (
                         'to'=>5,
                         'po_anatomy'=>6,
                         'po_growth_stage'=>7, # use ontology db term type  
                         'go_mf'=>4,
                         'go_bp'=>2,
                         'go_cc'=>3,
			 'eo'=>9
                         );  
       
     if($query){
       if($term_acc){ # internal search got from term keyword search
  
         @gene_objs = $db->get_genes_by_term_accession($term_acc,$species,$order_by);
         $term_search = $db->get_term_search_association($term_acc,$query);
       }else{ # regular search

         if($simple_fields{$search_field}){ 
    
           @gene_objs = $db->get_genes_by_simple_fields($query,$search_field,$species,$order_by);
    
         }elsif($search_field eq 'synonym' ){
            @gene_objs = $db->get_genes_by_synonym($query,$species,$order_by);
 
         }elsif($seq_fields{$search_field}){
            @gene_objs = $db->get_genes_by_sequence($query,$species,$order_by,$seq_fields{$search_field});  

         }elsif($ontology_fields{$search_field}){
            @term_objs = $db->get_candidate_term_associations($query,$ontology_fields{$search_field},$species);
            if(scalar(@term_objs) == 1){ # redirect to internal term search
	       $term_acc = $term_objs[0]->{'term_accession'};
               @gene_objs = $db->get_genes_by_term_accession($term_acc,$species,$order_by);
               $term_search = $db->get_term_search_association($term_acc,$query);
               @term_objs=();
            } 

	}else{ # search all fields
	    @gene_objs = $db->get_genes_by_all_fields($query,$species,$order_by);
        }
      }
   }



   if(@gene_objs){
      $pager  =  Data::Pageset->new( {
                total_entries    => scalar @gene_objs, 
                entries_per_page => PAGE_SIZE, 
                current_page     => $page_no,
                pages_per_set    => MAX_PAGES,
            } );
     @gene_objs    = $pager->splice(\@gene_objs);
  }
 
 }


# --------------------------------------------------------------- 
# mutant gene detail search
#
 if($acc){
     my $gene_id = $db->get_gene_id($acc);

     if($gene_id){
	 $gene_obj = $db->get_gene_general_info($gene_id);
         
         #an array of synonyms
         my $synonyms = $db->get_gene_synonyms($gene_id);
         $gene_obj->{'synonyms'} = $synonyms if($synonyms && scalar($synonyms)>0);

         # a hash of sequence  
         my $sequences = $db->get_gene_sequence_association($gene_id);
         $gene_obj->{'sequence_association'} = $sequences if $sequences;


         #a hash with term_type as key and array of temr objs as value 
         my $ontologys = $db->get_gene_ontology_association($gene_id);
         $gene_obj->{'ontology'} = $ontologys;



         my $references = $db->get_gene_references($gene_id);
         $gene_obj->{'references'} = $references;



     }
 }


#
# template processing
#
 if($acc){    # mutant gene detail display 
 
   $template->process( 
             DETAIL_TEMPLATE,
            {
                gramene_page  => $page,
                stylesheet    => $page->stylesheet,
                apr           => $apr,
                gene          => $gene_obj,
                species       => $all_species,
                title         => "Summary for Mutant &quot;".
                                 $gene_obj->{'accession'}."&quot;"
            },
            \$html
        ) or $html = $template->error;

}elsif($query_submit){   # mutant search results display
     
  $template->process( 
             DISPLAY_TEMPLATE,
            {
                gramene_page  => $page,
                stylesheet    => $page->stylesheet,
                apr           => $apr,
                genes         => \@gene_objs,
                terms         => \@term_objs, 
                term_search   => $term_search,     
                species       => $all_species,
                pager         => $pager,
                title         => "Search for Mutant &quot;$query&quot;".
                                 " by $search_field"
            },
            \$html
        ) or $html = $template->error; 





 }else{   # search interface

      $template->process( 
             SEARCH_TEMPLATE,
            {
                gramene_page  => $page,
                stylesheet    => $page->stylesheet,
                apr           => $apr,
                species       => $all_species,
                title         => "Mutant Search",
                search_page   => "1"
            },
            \$html
        ) or $html = $template->error;
}

 


 
};

if ( my $err = $@ ) {
    if ( $template ) {
        $template->process( 
            ERROR_TEMPLATE,
            {
                gramene_page  => $page,
                stylesheet    => $page->stylesheet,
                error_message => $err,
            },
            \$html
        ) or $html = $template->error;
    }
    else {
        $html = "Error: $err";
    }
}




$apr->content_type('text/html');
$apr->send_http_header;
$apr->print( $html );
