package ResultsRefinementManager;
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;
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_results");

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


sub get_new_model {
    my ($self) = @_;
    my %model = (
########################### system
	id => '',
	predictions_id =>'',
        date => '',
########################## file name
        TARGET => '',
        PFRMAT => '',
        CODE => '',
        MODEL => '',
        parent =>'',
        domain =>0,
########################### results

####################### 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 'predictions_id' ||
	$colunm_name eq 'date' ||
	########################## file name
	$colunm_name eq 'parent' ||
	$colunm_name eq 'domain' ||
	########################### 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 rr.id FROM %s rr JOIN casp9.predictions pr ON  (rr.predictions_id = pr.id)
	JOIN casp9.groups gr ON (pr.groups_id = gr.id)
	WHERE pr.target=\'%s\' and pr.pfrmat=\'%s\' and  pr.model=%d and gr.code=%d and rr.parent=%d and rr.domain=%d", $self->{_table},
      	$model{TARGET}, $model{PFRMAT}, $model{MODEL}, $model{CODE}, ($model{parent} eq '')?0:$model{parent}, ($model{domain} eq '')?0:$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_predictions_id {
    my ($self, %model) = @_;
    my $result = '';
    my $query = sprintf("SELECT pr.id FROM casp9.predictions pr JOIN casp9.groups gr ON (pr.groups_id = gr.id)
	WHERE pr.target=\'%s\' and pr.pfrmat=\'%s\' and  pr.model=%d and gr.code=%d",
      	$model{TARGET}, $model{PFRMAT}, $model{MODEL}, $model{CODE});
    my $sth = $self->{_database}->query($query);

    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 '')) ? 'rr.gdt_ts_4' : $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 rr.id=\'%s\' ", $params->{id});
    }

    if(defined($params->{target}) && ($params->{target} ne '')) {
	if ($params->{target} =~ /^(\S+)-D(\S+)/) {
	    $sub_query .= sprintf(" and pr.target=\'%s\' ", $1);
	    $domain = $2;
	} else {
	    $sub_query .= sprintf(" and pr.target=\'%s\' ", $params->{target});
	}
    }
    ## domain defenition
    if(defined($params->{domain}) && ($params->{domain} ne '')) {
	$sub_query .= sprintf(" and rr.domain=\'%s\' ", $params->{domain});
    } else{
	$sub_query .= sprintf(" and rr.domain=\'%s\' ", $domain);
    }

    if(defined($params->{groups_id}) && ($params->{groups_id} ne '')) {
	$sub_query .= sprintf(" and pr.groups_id=\'%s\' ", $params->{groups_id});
    }
    if(defined($params->{model}) && ($params->{model} ne '') && ($params->{model} ne 'all')) {
	$sub_query .= sprintf(" and pr.model=\'%s\' ", $params->{model});
    }

    my @results = ();
    my $query = sprintf("SELECT gr.id, pr.target, pr.pfrmat, gr.code, pr.model, rr.id, rr.parent, rr.domain, rr.gdt_ts_4, rr.gdt_ha_4, rr.rmsd_4, rr.alignment_4, rr.rmsd_all, rr.lga_4_tr
		FROM %s rr JOIN casp9.predictions pr ON  (rr.predictions_id = pr.id) JOIN casp9.targets tr ON  (pr.target = tr.name) JOIN casp9.groups gr ON (pr.groups_id = gr.id)
		WHERE 1=1 %s ORDER BY %s %s LIMIT 2500", $self->{_table}, $sub_query, $field, $order);
		my $sth = $self->{_database}->query($query);

    if(defined($sth) && ($sth->rows() > 0)) {
        my $index = 1;
        while(my($group_id, $target, $pfrmat, $code, $model, $id, $parent, $domain, $gdt_ts_4, $gdt_ha_4, $rmsd_4, $alignment_4, $rmsd_all, $lga_4_tr) = $sth->fetchrow_array()) {
	    push(@results, {
		INDEX => $index,
		GROUP_ID => $group_id,
		TARGET => $target,
		PFRMAT => $pfrmat,
		CODE => sprintf("%03d",$code),
		MODEL => $model,
		ID => $id,
		PARENT => $parent,
		DOMAIN => $domain,
		gdt_ts => sprintf("%.2f", $gdt_ts_4),
		gdt_ha => sprintf("%.2f", $gdt_ha_4),
		lga_4_tr => sprintf("%.2f", $lga_4_tr),
		rmsd => sprintf("%.2f", $rmsd_4),
		name => $r_m->build_model_name($target, $pfrmat, $code, $model, $parent, $domain),
		distances => $alignment_4,
		rmsd_all => $rmsd_all
		}
	    );
	    $index++;
        }
    }
    return @results;
}


#my $rr = new ResultsRefinementManager();

1;