#!/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';
my $target_name;
my $TARGET = GetOptions(
    "target|f=s" => \$target_name
);

sub upload_mvsm_results {
    ############################################################################################ 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});

    }
}

sub upload_ace_results {
    ############################################################################################ 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";
    }
}

sub join_ace_and_lga {
    ############################################################################################ 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
}

sub upload_rank {
    ############################################################################################ UPLOAD RANKS
    #### run this script when all results is uploaded
    $resultsupload_manager->update_rank($TARGET);
}

sub generate_images {
    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();

    ############################################################################################ 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);
}

sub upload_z_scores {
    ############# 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);
}

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

############################################################################################ LGA
sub upload_lga4_results {
    ##############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";
    }
}

sub upload_lga5_results {
    ##############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";
    }
    ############################################################################################ 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);
    }
}

sub upload_mammoth_results {
    ############################################################################################ 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";
    }
}

sub upload_rms_ca_results {
    $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);
    }
    my $count_files = 0;
    foreach my $line (@FILES_LIST) {
        $count_files ++;
        $line =~ /$directory\/(.*)/;
        my $file_name = $1;
        $resultsupload_manager->upload_lga_rms_ca($file_name, $directory, 4);
#           print "File #" . $count_files . "\n";
    }
}

sub run {

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

#	$TARGET = $target;
	$TARGET = $target_name;
	
	upload_rms_ca_results();
	upload_lga4_results();
	upload_lga5_results();
	upload_ace_results();
	join_ace_and_lga();
	upload_caca_results();
	upload_mvsm_results();
	upload_rank();
	upload_mammoth_results();
	generate_images();
	upload_z_scores();
	
        ############################################################################################ 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));
    }
#}

run();

exit(0);
1;
