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

use strict;
use Apache::Request;
use Template;
use Gramene::Page;
use Gramene::Literature::RefEditDB;


use constant DETAIL_TEMPLATE => 'literature_editing.tmpl';
use constant ERROR_TEMPLATE  => 'literature_editing_error.tmpl';
use constant SEARCH_TEMPLATE => 'literature_search.tmpl';
use constant DELETE_TEMPLATE => 'literature_del.tmpl';

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

my %args = $apr->args;



eval {

    $template =
      Template->new(
        { INCLUDE_PATH => '/usr/local/gramene/templates/literature', } );

    $db = Gramene::Literature::RefEditDB->new();
    $db->connect_to_db();
    
    my $show_association_link={     # the dbxref.xref_dbname mapping to assoc link
	'gramene.markers' => 'show_marker=1',
	'gramene.cmap.map_set' => 'show_cmap=1',
	'gramene.QTL' => 'show_qtl=1',
	'gramene.genes' => 'show_gene=1',
	'gramene.protein' => 'show_protein=1'
    };

    my $input_ref_id  = $apr->param('ref_id');

    my $ref;

    if ($input_ref_id) {
        $ref = $db->get_reference($input_ref_id);
    }
    if ( $ref ) {    #ref found
	my $ref_id = $ref->reference_id;
	if($apr->param('update_title')){
	    my $title = $apr->param('title');
	    $db->update_reference_title($ref,$title);
	}elsif($apr->param('update_source')){
	    my $source_name = $apr->param('source');
	    $db->update_reference_source($ref,$source_name);
	}elsif($apr->param('update_volume')){
	    $db->update_reference_volume(
		$ref,
		$apr->param('year'),
		$apr->param('vol'),
		$apr->param('start_page'),
		$apr->param('end_page')
	    );
	}elsif($apr->param('update_author')){
	    my $old_authors = $ref->{'author'};
	    my $new_authors = $apr->param('author');
	
	
	}elsif($apr->param('update_abstract')){
	    $db->update_reference_abstract($ref_id, $apr->param('abstract'));
	    $ref->{'abstract'} = $db->get_reference_abstract($ref_id);
	}elsif($apr->param('add_url')){
	    $db->add_reference_url($ref,$apr->param('new_url'));
	    $ref->{'urls'} = $db->get_reference_urls($ref_id);
	}elsif($apr->param('delete_url')){
	    my @url_ids = $apr->param('url_id');
	    foreach my $url_id (@url_ids){
		$db->delete_reference_url($url_id);
	    }
	    $ref->{'urls'} = $db->get_reference_urls($ref_id);
	}elsif($apr->param('add_pubmed')){
	    $db->add_reference_pubmed($ref,$apr->param('new_pubmed'));
	    $ref->{'PubMed'} = $db->get_reference_pubmed($ref_id);
	}elsif($apr->param('delete_pubmed')){
	    my @objx_ids = $apr->param('objx_id');
	    foreach my $objx_id (@objx_ids){
		$db->delete_objectxref($objx_id);
	    }
	    $ref->{'PubMed'} = $db->get_reference_pubmed($ref_id);

	}
	    

        $template->process(
            DETAIL_TEMPLATE,
            {
                gramene_page => $page,
                apr          => $apr,
                reference    => $ref,
		show_association_link =>$show_association_link
            },
            \$html
          )
          or $html = $template->error;

    }elsif($apr->param('delete_ref')){
	my $del_ref_id = $apr->param('del_ref_id');
	my $kept_ref_id = $apr->param('kept_ref_id');

	my @err_dels;
	my @msg_dels;

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

        if($del_ref_id){
	    my @del_ref_ids = split / /, $del_ref_id;
	    my @del_ref_ids_no_xref;

	    # check whether the refs have xrefs
	    foreach my $ref_id (@del_ref_ids){
		my $xrefs = $db->get_reference_all_xrefs($ref_id);
		if($xrefs && scalar(keys(%$xrefs))>0){
		    push @err_dels,"Ref ID $ref_id can't be deleted because it is used in other databases.";
		}else{
		    push @del_ref_ids_no_xref, $ref_id;
		}
	    }

	    if(@del_ref_ids_no_xref){
		my $temp_file = "./ref_deleted.txt";
		open(TEMP, ">>$temp_file") or die "$!";
		print TEMP '*'x20, "\n";
		print TEMP "KEPT: $kept_ref_id\n";
		foreach my $ref_id (@del_ref_ids_no_xref){
		    $db->delete_reference($ref_id);
		    print TEMP "Deleted: $ref_id\n";
		    print TEMP '*'x20,"\n";
		    push @msg_dels,"Ref ID $ref_id has beend deleted.";
		    print STDERR "Ref ID $ref_id has beend deleted.\n";
		}
		close(TEMP);

	    }


	}

      $template->process(
            DELETE_TEMPLATE,
            {
                gramene_page => $page,
                apr          => $apr,
		err_del_ref  => \@err_dels, 
		msg_del_ref  => \@msg_dels,
            },
            \$html
          )
          or $html = $template->error

    
    }else{
        my $show_header      = 1;
        my $search_not_found = 1 if ( $input_ref_id );

        $template->process(
            SEARCH_TEMPLATE,
            {
                gramene_page     => $page,
                apr              => $apr,
                show_header      => $show_header,
                search_no_result => $search_not_found
            },
            \$html
          )
          or $html = $template->error;

    }

};

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

if ( defined $db ) {
    $db->terminate_database;
}

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

