package CopyTargetsManager;

use strict;
use warnings;

#
# Class is used for copying targets from CASP13 to CASPROL if it was checked parameter is_casprol
# directories of casprol, also makes records to database for schema casprol.
#


use Cwd 'abs_path';

use lib qw(Core);

use Configuration;
use LocalConfiguration;

use Database;
use TargetsManager;
use TargetSequencesManager;

sub new {
    my ($class, $target_name, $casp13_sseq_id, $casp13_targ_id) = @_;
    my $self = {
	_database => Database->new($CONFIG->{HOSTNAME}, $CONFIG->{PORT}, $CONFIG->{DATABASE}, $CONFIG->{USERNAME}, $CONFIG->{PASSWORD}),
	_target_name => $target_name,
	_casp13_targ_id => $casp13_targ_id,
	_casp13_sseq_id => $casp13_sseq_id
    };
    
    bless $self, $class;
    return $self;
}


sub add_casprol_sseq{
    my ($self) = @_;
    my $result = 0;
    my $query = sprintf("SELECT accounts_id, protein_name, organism_name, number_of_aa, sequence, binding_site, sgi_center_id, sequence_family, is_nmr, has_map_or_spectra, current_state_description, chain_tracing_date, release_date, target FROM casp13.submitted_sequences WHERE id = %d", $self->{_casp13_sseq_id});
   
    my $sth = $self->{_database}->query($query);
    if(defined($sth) && ($sth->rows() > 0)) {
	my ($accounts_id, $protein_name, $organism_name, $number_of_aa, $sequence, $binding_site, $sgi_center_id, $sequence_family, $is_nmr, $has_map_or_spectra, $current_state_description, $chain_tracing_date, $release_date, $target) = $sth->fetchrow_array();

	$query = sprintf("INSERT INTO casprol.submitted_sequences (accounts_id, protein_name, organism_name, number_of_aa, sequence, binding_site, sgi_center_id, sequence_family, is_nmr, has_map_or_spectra, current_state_description, chain_tracing_date, release_date, target) VALUES (%d, '%s', '%s', %d, '%s', '%s', %d, '%s', %d, %d, '%s', '%s', '%s', '%s')", $accounts_id, quotemeta($protein_name), quotemeta($organism_name), $number_of_aa, quotemeta($sequence), quotemeta($binding_site), $sgi_center_id, quotemeta($sequence_family), $is_nmr, $has_map_or_spectra, quotemeta($current_state_description), quotemeta($chain_tracing_date), quotemeta($release_date), $target);
	
	$sth = $self->{_database}->query($query);
	if(defined($sth)){
		my $query = sprintf("SELECT MAX(id) FROM casprol.submitted_sequences");
	        my $sth = $self->{_database}->query($query);

        	# add logger
	        ($result) = $sth->fetchrow_array();
	}
	
    }
    return $result;
}

sub exist_casprol_sseq_id {
    my ($self) = @_;
    my $result = 0;
    my $query = sprintf("SELECT  sequence  FROM casp13.submitted_sequences where id = '%s'", $self->{_casp13_sseq_id});
    my $sth = $self->{_database}->query($query);
    my $sequence ;
    if(defined($sth)){
	($sequence) = $sth->fetchrow_array();
	
	$query = sprintf("SELECT id FROM casprol.submitted_sequences WHERE sequence = '%s' LIMIT 1", $sequence);

	$sth = $self->{_database}->query($query);
	if(defined($sth)){
	   ($result) = $sth->fetchrow_array();
	}
    }
    return $result;
}

sub update_casprol_sseq{
    my ($self, $casprol_sseq_id) = @_;
    my $result = 0;
    my $query = sprintf("SELECT accounts_id, protein_name, organism_name, number_of_aa, sequence, binding_site, sgi_center_id, sequence_family, is_nmr, has_map_or_spectra, current_state_description, chain_tracing_date, release_date, target  FROM casp13.submitted_sequences WHERE id = %d", $self->{_casp13_sseq_id});
   my ($accounts_id, $protein_name, $organism_name, $number_of_aa, $sequence, $binding_site, $sgi_center_id, $sequence_family, $is_nmr, $has_map_or_spectra, $current_state_description, $chain_tracing_date, $release_date, $target);
    my $sth = $self->{_database}->query($query);
    if(defined($sth) && ($sth->rows() > 0)) {
        ($accounts_id, $protein_name, $organism_name, $number_of_aa, $sequence, $binding_site, $sgi_center_id, $sequence_family, $is_nmr, $has_map_or_spectra, $current_state_description, $chain_tracing_date, $release_date, $target) = $sth->fetchrow_array();

        $query = sprintf("UPDATE casprol.submitted_sequences SET (accounts_id, protein_name, organism_name, number_of_aa, sequence, binding_site, sgi_center_id, sequence_family, is_nmr, has_map_or_spectra, current_state_description, chain_tracing_date, release_date, target) = (%d, '%s', '%s', %d, '%s', '%s', %d, '%s', %d, %d, '%s', '%s', '%s', '%s') WHERE id = %d ", $accounts_id, quotemeta($protein_name), quotemeta($organism_name), $number_of_aa, quotemeta($sequence), quotemeta($binding_site), $sgi_center_id, quotemeta($sequence_family), $is_nmr, $has_map_or_spectra, quotemeta($current_state_description), quotemeta($chain_tracing_date), quotemeta($release_date), $target, $casprol_sseq_id);
        
        $sth = $self->{_database}->query($query);
        if(defined($sth)){
                $result = 1;
        }

    }
    return $result;
}

sub exist_casprol_targ_id {
    my ($self) = @_;
    my $result = 0;
    my $query = sprintf("SELECT name FROM casp13.targets WHERE (id = %d)", $self->{_casp13_targ_id});
    my $name;
    my $sth = $self->{_database}->query($query);
    if(defined($sth) && ($sth->rows() > 0)) {
        ($name) = $sth->fetchrow_array();

	$query = sprintf("SELECT id FROM casprol.targets WHERE (name = '%s')", $name);
	$sth = $self->{_database}->query($query);
        if(defined($sth) && ($sth->rows() > 0)) {
	        ($result) = $sth->fetchrow_array();
        }
    }

    return $result;
}


sub add_casprol_targ{
    my ($self, $casprol_sseq_id) = @_;
    my $result = 0;
    my $query = sprintf("SELECT  name, is_server_only, is_refinement, comments, release_date, server_expiration_date, soft_expiration_date, human_expiration_date, cancelation_date, multimeric_status, target_list_comments, pdb_code, cancellation_status FROM casp13.targets WHERE id = %d", $self->{_casp13_targ_id});

    my $sth = $self->{_database}->query($query);
    if(defined($sth) && ($sth->rows() > 0)) {
	my ( $target, $is_server_only, $is_refinement, $comments, $release_date, $server_expiration_date, $soft_expiration_date, $human_expiration_date, $cancelation_date, $multimeric_status, $target_list_comments, $pdb_code, $cancellation_status) = $sth->fetchrow_array();
    
    	$query = sprintf("INSERT INTO casprol.targets (submitted_sequences_id, name, is_server_only, is_refinement, comments, release_date, human_expiration_date, server_expiration_date, soft_expiration_date, cancelation_date, multimeric_status, target_list_comments, pdb_code, cancellation_status) VALUES (%d, '%s', %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%d', '%s', '%s', %d)",
                        $casprol_sseq_id, $target, $is_server_only, $is_refinement, $comments, $release_date, $human_expiration_date, $server_expiration_date, $soft_expiration_date, $cancelation_date, $multimeric_status, $target_list_comments, $pdb_code, $cancellation_status);

	    $sth = $self->{_database}->query($query);

	    if(defined($sth)) {
	        my $query = sprintf("SELECT MAX(id) FROM casprol.targets");
	        my $sth = $self->{_database}->query($query);
	        # add logger
	        ($result) = $sth->fetchrow_array();
	    }
    }
    return $result;
}

sub update_casprol_targ{
   my ($self, $casprol_sseq_id, $casprol_targ_id) = @_;
   my $result = 0;
   my $query = sprintf("SELECT  name, is_server_only, is_refinement, comments, release_date, server_expiration_date, soft_expiration_date, human_expiration_date, cancelation_date, multimeric_status, target_list_comments, pdb_code, cancellation_status FROM casp13.targets WHERE id = %d", $self->{_casp13_targ_id});

    my $sth = $self->{_database}->query($query);
    if(defined($sth) && ($sth->rows() > 0)) {
        my ( $target, $is_server_only, $is_refinement, $comments, $release_date, $server_expiration_date, $soft_expiration_date, $human_expiration_date, $cancelation_date, $multimeric_status, $target_list_comments, $pdb_code, $cancellation_status) = $sth->fetchrow_array();
    
        $query = sprintf("UPDATE casprol.targets SET (submitted_sequences_id, name, is_server_only, is_refinement, comments, release_date, human_expiration_date, server_expiration_date, soft_expiration_date, cancelation_date, multimeric_status, target_list_comments, pdb_code, cancellation_status) = (%d, '%s', %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%d', '%s', '%s', %d) WHERE id = %d ",
                        $casprol_sseq_id, $target, $is_server_only, $is_refinement, $comments, $release_date, $human_expiration_date, $server_expiration_date, $soft_expiration_date, $cancelation_date, $multimeric_status, $target_list_comments, $pdb_code, $cancellation_status, $casprol_targ_id);

            $sth = $self->{_database}->query($query);

            if(defined($sth)) {
                
                $result = 1;
            }
    }
    return $result;

}




sub process_copy{
    my ($self) = @_;
    #return 1;
    my $casprol_seq_id = $self->exist_casprol_sseq_id();
    #return     $casprol_seq_id;
    if($casprol_seq_id > 0){
	$self->update_casprol_sseq($casprol_seq_id);
    }else{
	$casprol_seq_id = $self->add_casprol_sseq();
	if($casprol_seq_id == 0){
	  # TODO: log : fail to copy
	  return 0;
	} 	
    }

    my $casprol_targ_id = $self->exist_casprol_targ_id();
    if($casprol_targ_id > 0){
	$self->update_casprol_targ($casprol_seq_id, $casprol_targ_id);
    }else{
	$casprol_targ_id = $self->add_casprol_targ($casprol_seq_id);
	if($casprol_targ_id == 0){
	  # TODO: log : fail to copy
          return 0;
	}
    }

    my $old_file = $LOCAL_CONFIG->{TARGET_TEMPLATES_DIR} . "/".$self->{_target_name}.".seq.txt";
    my $new_file = abs_path($old_file);
    if(-e $new_file){
	$new_file =~ s/CASP13/CASPROL/g;
	$new_file =~ s/casp13/casprol/g;
        if(0 != system("cp -p $old_file $new_file")){ # if not ok 
            return 0;
        }
    }

    $old_file = $LOCAL_CONFIG->{TARGET_TEMPLATES_DIR} . "/".$self->{_target_name}.".pdb.txt";
    $new_file = abs_path($old_file);
    if(-e $new_file){
        $new_file =~ s/CASP13/CASPROL/g;
        $new_file =~ s/casp13/casprol/g;
        if(0 != system("cp -p $old_file $new_file")){ # if not ok 
            return 0;
        }
    }

    # if exists file with pdb structure
    $old_file = $LOCAL_CONFIG->{DATA_TARGETS_DIR}."/".$self->{_target_name}.".pdb";
    $new_file = abs_path($old_file);
    $old_file = abs_path($old_file);
    if(-f $old_file){
        $new_file =~ s/CASP13/CASPROL/g;
        $new_file =~ s/casp13/casprol/g;
        if(0 != system("cp -p $old_file $new_file")){ # if not ok 
            return 0;
        }
    }

    return 1;
}

1;

