#!/usr/bin/perl
use strict;
use warnings;

use lib qw(Core);
use lib qw(Classes);

#use Configuration;
#use LocalConfiguration;

use ResultsManager;
#use TargetsManager;
#use GroupsManager;
use ResultsTargetManager;

my @SCORES_LIST = (
        {
        db_id => 'gdt_ts_4',
        NAME => 'gdt_ts'
        },
        {
        db_id => 'gdt_ha_4',
        NAME => 'gdt_ha'
        },
        {
        db_id => 'gdc_all',
        NAME => 'gdc_all'
        },
        {
        db_id => 'lga_4_tr',
        NAME => 'gdc_sc'
        },
        {
        db_id => 'ace_rms_ca',
        NAME => 'rmsd'
        },
        {
        db_id => 'lga_s_5',
        NAME => 'lga_s'
        },
        {
        db_id => 'al0p',
        NAME => 'al0_p'
        },
        {
        db_id => 'dali_raw',
        NAME => 'dali(raw)'
        },
        {
        db_id => 'z_score_m',
        NAME => 'mammoth'
        },
        {
        db_id => 'mp_score',
        NAME => 'molprb'
        },
        {
        db_id => 'lddt',
        NAME => 'lddt'
        },
        {
        db_id => 'cad_aa',
        NAME => 'cad_aa'
        },
        {
        db_id => 'cad_ss',
        NAME => 'cad_ss'
        },
        {
        db_id => 'rpf',
        NAME => 'rpf'
        },
        {
        db_id => 'codm',
        NAME => 'codm'
        },
        {
        db_id => 'dfm',
        NAME => 'dfm'
        },
        {
        db_id => 'handedness',
        NAME => 'handed.'
        },
        {
        db_id => 'sov',
        NAME => 'sov'
        },
        {
        db_id => 'qcs',
        NAME => 'qcs'
        },
        {
        db_id => 'conts',
        NAME => 'conts'
        },
        {
        db_id => 'tm_score',
        NAME => 'tm_score'
        },
        {
        db_id => 'sg_lvr_6_2',
        NAME => 'sg'
        },
);

my @SCORES = qw/gdt_ts_4 gdt_ha_4 gdc_all lga_4_tr ace_rms_ca 
        lga_s_5 al0p dali_raw z_score_m mp_score lddt 
        cad_aa cad_ss rpf codm dfm 
        handedness sov qcs conts tm_score sg_lvr_6_2/;


my @comp_tos = qw/first best/;

my $r_target_manager = new ResultsTargetManager();
my @targets_list = $r_target_manager->get_result_targets({tr_type => 'others'});
#@targets_list = &filterTargetList(\@targets_list);
foreach my $t (@targets_list){
#    print $t->{NAME}."\n";
} 
#exit;

my $results_manager = new ResultsManager();


foreach my $comp_to (@comp_tos){
   my $outFile = "/local/CASP13/tmp_Grishin/AssistedTargets_Summary.$comp_to.csv";
   open OUT, "> $outFile ";
   printf OUT  "%-9s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n", "score", "target", "model",  "T0_", "Tp_", "df_Tp", "Ts_", "df_Ts", "Tc_", "df_Tc", "Tx_", "df_lTx" ;
   foreach my $t (@targets_list){
	my $target = $t->{NAME};
       	print $target."\n";
	my $target0 = &getReferenceTarget($target);
	foreach my  $score (@SCORES_LIST) {
		my $params = {'target' => $target, 'target0' => $target0, 'comp_to' => "$comp_to", 'models' => "all", 'score'=>$score->{db_id}};
		my @results = $results_manager->getAssistedResultsForTarget($params);
		foreach my $res (@results){
			printf OUT "%-9s\t%s\tTS%03d_%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n", $score->{NAME}, $target, $res->{gr_code}, $res->{model}, $res->{T0_SCORE}, $res->{Tp_SCORE}, $res->{Tp_SCORE_DIFF}, $res->{Ts_SCORE}, $res->{Ts_SCORE_DIFF}, $res->{Tc_SCORE}, $res->{Tc_SCORE_DIFF}, $res->{Tx_SCORE}, $res->{Tx_SCORE_DIFF} ;
		}
	}
   }
}








#---------------------
# SUBROUTINES
#---------------------
sub getReferenceTarget{
    my ($target) = @_;
    my $target0 = undef;
    if ($target =~ m/^([TR])[acspx]([0-9]{3}-D[1-6])$/){
        $target0 = $1."0".$2;
        return $target0;
    }
    my $file = sprintf("%s/%s[acspx]%s.pdb", "/local/CASP13/TARGETS", substr($target,0,1), substr($target, 2, 3) );
    if (open F, "cat $file | grep \"REMARK\" | grep \"Compare\" |"){
        while (defined(my $l = <F>)){
           if ($l =~ m/REMARK\s+Compare\s+.*\s+([TR]0[0-9]{3}\S*)\s+/){
                $target0 = $1;
                last;
           }
        }
        close F;
    }
    if (!defined($target0)){
        $target0 = $target;
        substr($target0, 1, 1) = '0'; # change the second symbmol with '0'
    }
    if ($target0 =~ m/([TR]0[0-9]{3})-D0/){
        $target0 = $1;
    }
    return $target0;
}


sub filterTargetList{
    my ($refArr) = @_;
    my @targetList;
    my %hashDone;
    foreach my $t (@{$refArr}) {
        my $newname = sprintf("%s_%s", substr($t->{NAME}, 0, 1), substr($t->{NAME}, 2));
        if (!exists($hashDone{$newname})){
                $hashDone{$newname} = 1;
                push @targetList, {
#                       NAME => $newname,
                        NAME => $t->{NAME},
                        no => substr($t->{NAME}, 2,3),
                };
        }
    }
    return (sort {$a->{no} <=> $b->{no}} @targetList);
}
