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

use Digest::MD5 qw(md5 md5_hex md5_base64);
use MIME::Parser;
use MIME::Entity;
use MIME::Body;
use Getopt::Long;


use lib qw(Core);
use lib qw(Classes);
use ImagesManager;
use ResultsManager;
use ResultsUploadManager;

use Logger;

my $SCRIPTNAME = 'upload_results.pl';

#my $logger = new Logger();

my $directory = "";
my @FILES_LIST = ();
my $count_files = 0;


my $results_manager = new ResultsManager();
my $resultsupload_manager = new ResultsUploadManager();

my $TARGET = "T0536";

my $target_list = 'conf/targets_list';

open (TL, $target_list) || die "Cannot open input file $target_list: $!";
while(my $target = <TL>) {
	chomp($target);
	if ($target =~ /^#/){next;}

	$TARGET = $target;



#$resultsupload_manager->upload_lga_rms_ca($TARGET);
#$resultsupload_manager->upload_lga_rms_all($TARGET);
#next;

my $protein_pdb = '/data/CASP9/TARGETS/'.$TARGET.'.pdb';
my $output_small_str_image_png = '/data/CASP9/PLOTS/STR/'.$TARGET.'.small.png'; #structure image
my $images_manager = new ImagesManager();

$resultsupload_manager->generate_al_small_images($TARGET);
$resultsupload_manager->generate_gdt_images($TARGET);
############# end
#exit(0);

############# end
#exit(0);

##### UPLOAD RANK 
#$resultsupload_manager->upload_rank($TARGET);
#exit(0);

############## MAMMOTH UPLOAD
#$directory = "/data/CASP9/RESULTS/MAMMOTH/$TARGET";
#@FILES_LIST = ();
#if(open(FILE_list_of_results, "/bin/ls " . $directory. "/* |")) {
#            @FILES_LIST = <FILE_list_of_results>;
#            close (FILE_list_of_results);
#}
#$count_files = 0;
#foreach my $line (@FILES_LIST) {
#    	$count_files ++;	
#	$line =~ /$directory\/(.*)/;
#	my $file_name = $1;
#	$resultsupload_manager->upload_mammoth($file_name, $directory);
#	print "File #" . $count_files . "\n";
#}

#exit(0);

############################################################################################ ACE
############## ACE RESULTS 
$directory = "/data/CASP9/RESULTS/ACE/$TARGET";
@FILES_LIST = ();
if(open(FILE_list_of_results, "/bin/ls " . $directory. "/* |")) {
        @FILES_LIST = <FILE_list_of_results>;
            close (FILE_list_of_results);
}    
$count_files = 0;
foreach my $line (@FILES_LIST) {
	$count_files ++;	
	$line =~ /$directory\/(.*)/;
	my $file_name = $1;
	$resultsupload_manager->upload_ace($file_name, $directory);
	print "File #" . $count_files . "\n";
}
############################################################################################ JOIN LGA and ACE 
############# JOIN LGA 4 A results with ACE
my $lga_results_dir = "/data/CASP9/RESULTS/LGA/4A/DATA/".$TARGET;
my $ace_results_dir = "/data/CASP9/RESULTS/ACE/".$TARGET;
my $lga_ace_results_dir = "/data/CASP9/RESULTS/LGA_ACE/".$TARGET;
$resultsupload_manager->join_lga_with_ace($lga_results_dir, $ace_results_dir, $lga_ace_results_dir, $TARGET);
############ JOIN end

############################################################################################ LGA
##############4A LGA PREDICTIONS 
$directory = "/data/CASP9/RESULTS/LGA/4A/DATA/$TARGET";
@FILES_LIST = ();
if(open(FILE_list_of_results, "/bin/ls " . $directory. "/* |")) {
            @FILES_LIST = <FILE_list_of_results>;
            close (FILE_list_of_results);
}
$count_files = 0;
foreach my $line (@FILES_LIST) {
    	$count_files ++;	
	$line =~ /$directory\/(.*)/;
	my $file_name = $1;
	$resultsupload_manager->upload_lga($file_name, $directory, 4);
	print "File #" . $count_files . "\n";
}
##############5A LGA PREDICTIONS 
$directory = "/data/CASP9/RESULTS/LGA/5A/DATA/$TARGET";
@FILES_LIST = ();
if(open(FILE_list_of_results, "/bin/ls " . $directory. "/* |")) {
           @FILES_LIST = <FILE_list_of_results>;
           close (FILE_list_of_results);
}    
$count_files = 0;
foreach my $line (@FILES_LIST) {
    	$count_files ++;	
	$line =~ /$directory\/(.*)/;
	my $file_name = $1;
	$resultsupload_manager->upload_lga($file_name, $directory, 5);
	print "File #" . $count_files . "\n";
}


############################################################################################ MVSM
############## MVSM RESULTS 
$directory = "/data/CASP9/RESULTS/MVSM/DATA/$TARGET";
@FILES_LIST = ();
if(open(FILE_list_of_results, "/bin/ls " . $directory. "/* |")) {
            @FILES_LIST = <FILE_list_of_results>;
            close (FILE_list_of_results);
}    
$count_files = 0;
foreach my $line (@FILES_LIST) {
    	$count_files ++;	
	$line =~ /$directory\/(.*)/;
	my $file_name = $1;
	$resultsupload_manager->upload_mvsm($file_name, $directory);
	print "File #" . $count_files . "\n";
}
############ MVSM Count upload
my $parameters = {'target' => $TARGET};
my @results = $results_manager->get_results($parameters);

for(my $count = 0; $count < scalar(@results); $count++) {

print $results[$count]->{ID} . "\n";

	$resultsupload_manager->update_mvsm_results($results[$count]->{ID});

}

############################################################################################ MAMMOTH
############## MAMMOTH UPLOAD
$directory = "/data/CASP9/RESULTS/MAMMOTH/$TARGET";
@FILES_LIST = ();
if(open(FILE_list_of_results, "/bin/ls " . $directory. "/* |")) {
            @FILES_LIST = <FILE_list_of_results>;
            close (FILE_list_of_results);
}
$count_files = 0;
foreach my $line (@FILES_LIST) {
    	$count_files ++;	
	$line =~ /$directory\/(.*)/;
	my $file_name = $1;
	$resultsupload_manager->upload_mammoth($file_name, $directory);
	print "File #" . $count_files . "\n";
}




############################################################################################ UPLOAD RANKS
#### run this script when all results is uploaded
$resultsupload_manager->update_rank($TARGET);
############################################################################################ UPLOAD AL from LGA5
my $targets_dir = '/data/CASP9/TARGETS/';
my $lga_rotated_dir = '/data/CASP9/RESULTS/LGA/5A/ROTATED';
my $lga_rotated_target_dir = sprintf("%s/%s/", $lga_rotated_dir, $TARGET);
my @models_rotated = ();
if(open(MODELS, sprintf("ls -1 %s |", $lga_rotated_target_dir))) {
    while(<MODELS>) {
        chomp;
        push(@models_rotated, $_);
    }    
    close(MODELS);
}
my $models_count_rotated = scalar(@models_rotated);
for(my $i = 0; $i < $models_count_rotated; $i++) {
    $resultsupload_manager->upload_al_alignment_new($targets_dir, sprintf("%s.pdb", $TARGET), $lga_rotated_target_dir, $models_rotated[$i]);
}

############################################################################################ UPLOAD EQ from LGA5
my $lga_alignment_dir = '/data/CASP9/RESULTS/LGA/5A/ALIGNMENT';
#my $target = 'T0387';
my $lga_alignment_target_dir = sprintf("%s/%s/", $lga_alignment_dir, $TARGET);
my @models_alignment = ();
if(open(MODELS, sprintf("ls -1 %s |", $lga_alignment_target_dir))) {
    while(<MODELS>) {
        chomp;
        push(@models_alignment, $_);
    }    
    close(MODELS);
}
my $models_count_alignment = scalar(@models_alignment);
for(my $i = 0; $i < $models_count_alignment; $i++) {
    $resultsupload_manager->upload_eqv_alignment($models_alignment[$i], $lga_alignment_target_dir);
}


############################################################################################ CACA ERRORS
############# UPLOAD CACA - errors 
$resultsupload_manager->upload_caca(sprintf("%s.CAerr",$TARGET), "/data/CASP9/RESULTS/CACA");

############# UPLOAD Z-Score
# TODO set Z-score for all target to 0
$resultsupload_manager->upload_gdt_z_score($TARGET);
# SERVER
$resultsupload_manager->upload_gdt_z_score_server_group($TARGET);
# ALL GROUPS
### BY ALL MODELS 
$resultsupload_manager->upload_gdt_z_score_by_all_model($TARGET);
# SERVER
$resultsupload_manager->upload_gdt_z_score_server_by_all_model($TARGET);

$resultsupload_manager->upload_gdt_ha_z_score_server_group($TARGET);
$resultsupload_manager->upload_gdt_ha_z_score_all_group($TARGET);

############################################################################################ IMMAGES (small) for result targets page
#### GENERATE STRUCTURE IMAGE
$images_manager->protein_image($protein_pdb, $output_small_str_image_png, 74, 74);
#### GENERATE GDT IMAGE
$resultsupload_manager->generate_gdt_images($TARGET);
#### GENERATE AL IMAGES
$resultsupload_manager->generate_al_small_images($TARGET);

############################################################################################ Results Targets Table

$resultsupload_manager->upload_results_targets($TARGET);

#######################permissions
system (sprintf("chmod 777 /data/CASP9/PLOTS/AL/%s -R", $TARGET));
system (sprintf("chmod 777 /data/CASP9/PLOTS/GDT/%s -R", $TARGET));
system (sprintf("chmod 777 /data/CASP9/PLOTS/EQV/%s -R", $TARGET));
my $spice_target_name = $TARGET;
$spice_target_name =~ tr/-/_/d;
system (sprintf("ln -s /data/CASP9/RESULTS/LGA/4A/DATA/%s/ /casp4das/DATA/dep/%s", $TARGET, $spice_target_name));
system (sprintf("ln -s /data/CASP9/RESULTS/LGA/5A/DATA/%s/ /casp4das/DATA/indep/%s", $TARGET, $spice_target_name));
system (sprintf("cp /data/CASP9/TARGETS/%s.pdb /casp4das/DATA/targets/%s.pdb", $TARGET, $spice_target_name));
system (sprintf("chmod 777 /casp4das/DATA/targets/%s.pdb", $spice_target_name));
}

exit(0);
1;