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

use strict;
use Apache::Request;
use Template;
use Template::Constants qw( :debug );
use Gramene::Page;
use Gramene::Config;
use Gramene::Protein::EditProteinDB;

use constant DETAIL_TEMPLATE => 'protein_util_editing.tmpl';
use constant ERROR_TEMPLATE  => 'add_util_error.tmpl';

my $apr            = Apache::Request->new( Apache->request );
my $page           = Gramene::Page->new($apr);
my $config         = Gramene::Config->new;
my $protein_config = $config->get('protein_editing');

my ( $template, $html, $db );

my %utils = (
    dbxref 	 => \&util_dbxref,
    feature_type => \&util_feature_type,
    species 	 => \&util_species,
    cultivar 	 => \&util_cultivar,
);


eval {

    $template =
      Template->new( { INCLUDE_PATH => $protein_config->{'template_dir'}, } );

    $db = Gramene::Protein::EditProteinDB->new();
    $db->connect_to_db();

    my $util = {};

    my $util_query = $apr->param('util');
    if($util_query && $utils{$util_query}){
	$utils{$util_query}->($apr, $db, $util);
    }

    $template->process(
	DETAIL_TEMPLATE,
        {
            gramene_page => $page,
            apr          => $apr,
            util         => $util,
        },
        \$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);

# ----------------------------------

sub util_dbxref {
    my ($apr, $db, $util) = @_;

    # selected xref_db
    if($apr->param('xref_db')){
	my $xref_db = $db->get_xref_db($apr->param('xref_db'));
	$util->{'xref_db'} = $xref_db if $xref_db;
    }

    # update
    if($apr->param('update_dbxref')){
	my $dbx_id = $apr->param('xdb_id');
	my $dbx_name = $apr->param('xdb_name');
	my $dbx_url = $apr->param('xdb_url');
	if($dbx_id && $dbx_name && $dbx_url){
	    $db->update_dbxref_source($dbx_id, $dbx_name, $dbx_url);
	}
    }

    # add
    if($apr->param('add_dbxref')){
	my $dbx_name = $apr->param('xdb_name');
	my $dbx_url = $apr->param('xdb_url');
	if($dbx_name && $dbx_url){
	    $db->add_dbxref_source($dbx_name, $dbx_url);
	}
    

    }
	
    my @all_xref_dbs = $db->get_all_xref_dbs;
    $util->{'xref_dbs'} = \@all_xref_dbs;


    # default selected xref_db
    unless($apr->param('xref_db')){
        my $default_selection = $all_xref_dbs[0]->{'data_base_id'};
	my $xref_db = $db->get_xref_db($default_selection);
	$util->{'xref_db'} = $xref_db if $xref_db;
    }
}


# ----------------------------------

sub util_feature_type {
    my ($apr, $db, $util) = @_;

    # selected feature_type
    if($apr->param('feature_type')){
	my $feature_type = $db->get_feature_type($apr->param('feature_type'));
	$util->{'feature_type'} = $feature_type if $feature_type;
    }

    # update
    if($apr->param('update_feature_type')){
	my $ft_id = $apr->param('feature_type_id');
	my $ft = $apr->param('feature_type_name');
	if($ft_id && $ft){
	    $db->update_feature_type($ft_id, $ft);
	}
    }

    # add
    if($apr->param('add_feature_type')){
	my $ft = $apr->param('feature_type_name');
	$db->add_feature_type($ft) if $ft;
    }
	
    my @all_feature_types = $db->get_all_feature_types;
    $util->{'feature_types'} = \@all_feature_types;


    # default selected feature_type
    unless($apr->param('feature_type')){
	my $default_selection = $all_feature_types[0]->{'feature_type_id'};
	my $feature_type = $db->get_feature_type($default_selection);
	$util->{'feature_type'} = $feature_type if $feature_type;
    }
}




# ----------------------------------

sub util_species {
    my ($apr, $db, $util) = @_;

    # select species 
    if($apr->param('select_spe')){
	my $species = $db->get_species($apr->param('select_spe'));
	$util->{'species'} = $species if $species;
    }

    # update
    if($apr->param('update_species')){
	my $spe_id = $apr->param('species_id');
	my $genus = $apr->param('spe_genus');
	my $spe = $apr->param('spe_species');
	my $name = $apr->param('spe_name');
	my $taxid = $apr->param('spe_taxid');
	if($genus || $spe || $name || $taxid){
	    $db->update_species($spe_id, $genus, $spe, $name, $taxid);
	}
    }

    # add
    if($apr->param('add_species')){
	my $genus = $apr->param('spe_genus');
	my $spe = $apr->param('spe_species');
	my $name = $apr->param('spe_name');
	my $taxid = $apr->param('spe_taxid');
	if($genus || $spe || $name || $taxid){
	    $db->add_species($genus, $spe, $name, $taxid);
	}
    

    }
	
    my @all_species = $db->get_all_species;
    $util->{'all_species'} = \@all_species;


    #default selected species 
    unless($apr->param('select_spe')){
	my $default_selection = $all_species[0]->{'species_id'};
	my $species = $db->get_species($default_selection);
	$util->{'species'} = $species if $species;
    }
}



# ----------------------------------

sub util_cultivar {
    my ($apr, $db, $util) = @_;

    my $species_id;
    my $cultivar_id;

    # select species
    if($apr->param('select_spe')){
	$species_id = $apr->param('select_spe');
    }


    # select cultivar 
    if($apr->param('select_cul')){
	$species_id = $apr->param('species_id');
	$cultivar_id = $apr->param('select_cul');
    }

    # update
    if($apr->param('update_cultivar')){
	my $new_species_id = $apr->param('new_species_id');
	$cultivar_id = $apr->param('cultivar_id');
	my $cul_name = $apr->param('cul_name');
	if($cul_name && $new_species_id){
	    # cultivar maybe merged to another one (under different species) 
	    ($species_id, $cultivar_id) = $db->update_cultivar($new_species_id, $cultivar_id, $cul_name);
	}
    }

    # delete
    if($apr->param('delete_cultivar')){
	$species_id = $apr->param('species_id');
	$cultivar_id = $apr->param('cultivar_id');
	$cultivar_id = $db->delete_cultivar($cultivar_id);
    }

    # merge
    if($apr->param('merge_cultivar')){
	$species_id = $apr->param('species_id');
	$cultivar_id = $apr->param('cultivar_id');
	my $new_cul_id = $apr->param('new_cul_id');
	my ($db_new_cul_id, $db_new_species_id) = $db->merge_cultivars($cultivar_id,$new_cul_id);
	$cultivar_id = $db_new_cul_id if($db_new_cul_id);
	$species_id = $db_new_species_id if($db_new_species_id);
    }

    # add
    if($apr->param('add_cultivar')){
	my $new_species_id = $apr->param('species_id');
	my $new_cul_name = $apr->param('cul_name');
	if($new_species_id && $new_cul_name){
	    my $new_cul_id = $db->add_cultivar($new_species_id, $new_cul_name);
	    $species_id = $new_species_id;
	    $cultivar_id = $new_cul_id; 
	}
    }
	
    my @all_species = $db->get_all_species;
    $util->{'all_species'} = \@all_species;

    $species_id = $all_species[0]->{'species_id'} unless $species_id; # default species_id
    
    $util->{'species_id'} = $species_id;
    my @cultivars = $db->get_all_species_cultivar($species_id);
    $util->{'cultivars'} = \@cultivars;



    #default selected cultivar 
    $cultivar_id = $cultivars[0]->{'cultivar_id'} unless($cultivar_id);
    my $cultivar = $db->get_cultivar($species_id, $cultivar_id);
    $util->{'cultivar'} = $cultivar if $cultivar;
    
}

