package ResultsTargetRefinementManager;
use strict;
use warnings;


use DBI;
use Digest::MD5 qw(md5 md5_hex md5_base64);
use DateTime;
use lib qw(Core);
use Database;
use PDBUtils;
use Configuration;
use LocalConfiguration;
use ResultsManager;
use TargetsManager
my $r_m = new ResultsManager();
use CGI qw(:all);
use BO;
our @ISA = qw(BO);
sub new {
    my ($class) = @_;
    my $self = $class->SUPER::new("casp9.refinement_target_results");

    bless $self, $class;
    return $self;
}


sub get_new_model {
    my ($self) = @_;
    my %model = (
########################### system
	id => '',
	targets_id => '',
	domain => 0,
        date => '',
########################## file name
        TARGET => '',
####################### LGA 4
################# SUMMARY
	#n1_4 => '',
	#n2_4 => '',
	#dist_4=> '',
	#nres_4 => '',
	rmsd_4 => '',
	gdt_ts_4 => '',
	#lga_s_4 => '',
	#lga_q_4 => '',
	#gdt_ca_percentage_4 => '',
	#asgn_4 => '',
	#np_p_4 => '',
	gdt_ha_4 => '',
	alignment_4 => '',
	rmsd_all => '',
	lga_4_tr => '',
	INDEX => 0
    );
    return %model;
}

sub is_table_column {
my ($self, $colunm_name) = @_;
my $result = 0;
if(	$colunm_name eq 'id' ||
	$colunm_name eq 'targets_id' ||
	$colunm_name eq 'domain' ||
	$colunm_name eq 'date' ||
	########################### results
	####################### LGA 4
	################# SUMMARY
	#$colunm_name eq 'n1_4' ||
	#$colunm_name eq 'n2_4' ||
	#$colunm_name eq 'dist_4' ||
	#$colunm_name eq 'nres_4' ||
	$colunm_name eq 'rmsd_4' ||
	$colunm_name eq 'gdt_ts_4' ||
	#$colunm_name eq 'lga_s_4' ||
	#$colunm_name eq 'lga_q_4' ||
	$colunm_name eq 'gdt_ha_4' ||
	$colunm_name eq 'alignment_4' ||
	$colunm_name eq 'rmsd_all' ||
		$colunm_name eq 'lga_4_tr'
  ) {
	$result = 1;
	}
    return $result;
}

sub exist_by_parameters {
    my ($self, %model) = @_;
    my $result = 0;
    my $query = sprintf("SELECT rt.id FROM %s rt JOIN casp9.targets tr ON (rt.targets_id = tr.id)
	WHERE tr.id=\'%s\' and  rt.domain =%s ", $self->{_table},
      	$model{targets_id}, $model{domain});
    my $sth = $self->{_database}->query($query);
    #print $query ."\n";
    if(defined($sth) && ($sth->rows() > 0)) {
        my ($id) = $sth->fetchrow_array();
	$result = $id;
    }
    return $result;
}


sub get_rows {
    my ($self, $params) = @_;
    my $field = $params->{field};
    my $order = $params->{order};
    #my $view_targets = $params->{view_targets};
    #my $view = $params->{view};
    #print "Content-Type: text/html; charset=ISO-8859-1\n\n";
    #foreach my $parameter (keys %{$params}) {
    #	print $parameter . " => " . $params->{$parameter}. "<br>";
    #}
    $field = (!defined($field) || ($field eq '')) ? 'tr.name' : $field;
    $order = (!defined($order) || ($order eq '')) ? 'DESC' : $order;

    #### DO MULTIPLE SORTING
    my $count_to_replace = 0;
	while ($field =~ s/, / $order,/ || $count_to_replace >20){
	$count_to_replace ++;
    }
    ####
    my $domain = 0;
    my $sub_query = "";

    if(defined($params->{id}) && ($params->{id} ne '')) {
 	$sub_query .= sprintf(" and rt.id=\'%s\' ", $params->{id});
    }
    ## NOTE DOMAINS NOT IMPLEMENTED FOR REFINEMENT TARGETS
    if(defined($params->{target}) && ($params->{target} ne '')) {
	if ($params->{target} =~ /^(\S+)-D(\S+)/) {
	    $sub_query .= sprintf(" and tr.name=\'%s\' ", $1);
	    $domain = $2;
	} else {
	    $sub_query .= sprintf(" and tr.name=\'%s\' ", $params->{target});
	}
    }
   ## domain defenition
   if(defined($params->{domain}) && ($params->{domain} ne '')) {
	$sub_query .= sprintf(" and rt.domain=\'%s\' ", $params->{domain});
   } elsif( $domain ne 0 ){
	$sub_query .= sprintf(" and rt.domain=\'%s\' ", $domain);
   }

    my @results = ();
    my $query = sprintf("SELECT rt.id, tr.name, tr.id, rt.domain, rt.gdt_ts_4, rt.gdt_ha_4, rt.rmsd_4, rt.alignment_4, ss.number_of_aa, rt.rmsd_all, rt.lga_4_tr
		FROM %s rt JOIN casp9.targets tr ON  (tr.id = rt.targets_id) JOIN casp9.submitted_sequences ss ON  (ss.id = tr.submitted_sequences_id)
		WHERE 1=1 %s ORDER BY %s %s, domain ASC LIMIT 2500", $self->{_table}, $sub_query, $field, $order);
    my $sth = $self->{_database}->query($query);

    #print $query;

    if(defined($sth) && ($sth->rows() > 0)) {
        my $index = 1;
        while(my($id, $target, $targets_id, $domain, $gdt_ts_4, $gdt_ha_4, $rmsd_4, $alignment_4, $number_of_aa, $rmsd_all ,$lga_4_tr) = $sth->fetchrow_array()) {
	    push(@results, {
		INDEX => $index,
		ID => $id,
		TARGET => $target,
		TARGETS_ID => $targets_id,
		DOMAIN => $domain,
		gdt_ts => sprintf("%.2f", $gdt_ts_4),
		gdt_ha => sprintf("%.2f", $gdt_ha_4),
		rmsd => sprintf("%.2f", $rmsd_4),
		distances => $alignment_4,
		number_of_aa => $number_of_aa,
		rmsd_all => $rmsd_all,
		lga_4_tr => $lga_4_tr,
		}
	    );
	    $index++;
        }
    }
    return @results;
}

sub get_ranges_array {
    my ($self, $full_target) = @_;
    my $range_str = "";
    my $tr_m = new TargetsManager();
    my %tr_info = $tr_m->info($tr_m->get_id_by_name($full_target));
    $range_str = $tr_info{NUMBER_OF_AA};
    my @ranges = ();
    my @subdomains = split(/,/, $range_str);
    #foreach my $subdomain (@subdomains) {
#	    $subdomain =~ /^(\d+)[-](\d+)$/;
#	    for (my $j = int($1); $j <= int($2); $j++) {
#		    push @ranges, $j;
#	    }
#    }
    foreach my $subdomain (@subdomains) {
	my $from = 0;
	my $to = 0;
	if ($subdomain =~ /^(\d+)[-](\d+)$/) {
	    $from = int($1);
	    $to = int($2);
	} elsif($subdomain =~ /^(\d+)$/) {
	    $from = int($1);
	    $to = $from;
	}
	for (my $j = $from; $j <= $to; $j++) {
	    push @ranges, $j;
	}
    }
    return @ranges;

}


#my $rt = new ResultsTargetRefinementManager();

1;
