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

use Getopt::Long;
use Switch;


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

use LocalConfiguration;

use MultimerResultsEmmUploadManager;
use MultimerResultsEmmManager;
use Logger;

my $SCRIPTNAME = 'upload_results_cryoem.pl';

#my $logger = new Logger();

my $directory = "";
my @FILES_LIST = ();
my $count_files = 0;
my $casp_version = uc($LOCAL_CONFIG->{CASP_VERSION});
my $RESULT_DIR = "/local/$casp_version/RESULTS/cryoEM/";

my $target_names = "";
my $actions;
my $TARGET = GetOptions(
	"targets=s" => \$target_names,
	"actions=s" => \$actions,
);


sub upload_TemPy_results{
    $directory = $RESULT_DIR . "/tempy/$TARGET";
    @FILES_LIST = ();
    opendir D, "$directory";
    while(defined(my $f = readdir(D))){
        if ($f =~ m/^\./){
           next;
        }
        #if ($f !~ m/\.pdb/){
        #   next;
        #}
        if ($f =~ m/tempy$/){
           push @FILES_LIST, $f;
        }
    }
    closedir (D);
    $count_files = 0;
    my $upload_manager = new  MultimerResultsEmmUploadManager();
    foreach my $file_name (@FILES_LIST) {
        $count_files ++;
        $upload_manager->upload_TemPy($file_name, $directory);
        print "File #" . $count_files . "\n";
    }
}

sub upload_TemPy_OV_scores{
    $directory = $RESULT_DIR . "/tempy/$TARGET";
    @FILES_LIST = ();
    opendir D, "$directory";
    while(defined(my $f = readdir(D))){
        if ($f =~ m/^\./){
           next;
        }
        #if ($f !~ m/\.pdb/){
        #   next;
        #}
        if ($f =~ m/tempy_scoresN$/){
           push @FILES_LIST, $f;
        }
    }
    closedir (D);
    $count_files = 0;
    my $upload_manager = new  MultimerResultsEmmUploadManager();
    foreach my $file_name (@FILES_LIST) {
        $count_files ++;
        $upload_manager->upload_TemPy_OV_scores($file_name, $directory);
        print "File #" . $count_files . "\n";
    }
}

sub upload_TemPy_smoc_results{
    $directory = $RESULT_DIR . "/tempy/$TARGET";
    @FILES_LIST = ();
    opendir D, "$directory";
    while(defined(my $f = readdir(D))){
        if ($f =~ m/^\./){
           next;
        }
    #    if ($f !~ m/\.pdb/){
    #       next;
    #    }
        if ($f =~ m/smoc_dist$/){
           push @FILES_LIST, $f;
        }
    }
    closedir (D);
    $count_files = 0;
    my $upload_manager = new  MultimerResultsEmmUploadManager();
    foreach my $file_name (@FILES_LIST) {
        $count_files ++;
        $upload_manager->upload_TemPy_smoc($file_name, $directory);
        print "File #" . $count_files . "\n";
    }
}

sub upload_TemPy_ccc_mask{
    $directory = $RESULT_DIR . "/tempy/$TARGET";
    @FILES_LIST = ();
    opendir D, "$directory";
    while(defined(my $f = readdir(D))){
        if ($f =~ m/^\./){
           next;
        }
    #    if ($f !~ m/\.pdb/){
    #       next;
    #    }
        if ($f =~ m/ccc_mask$/){
           push @FILES_LIST, $f;
        }
    }
    closedir (D);
    $count_files = 0;
    my $upload_manager = new  MultimerResultsEmmUploadManager();
    foreach my $file_name (@FILES_LIST) {
        $count_files ++;
        $upload_manager->upload_TemPy_ccc_mask($file_name, $directory);
        print "File #" . $count_files . "\n";
    }
}


sub upload_PHENIX_results{
    $directory = $RESULT_DIR . "/map_vs_model/$TARGET";
    @FILES_LIST = ();
    opendir D, "$directory";
    while(defined(my $f = readdir(D))){
        if ($f =~ m/^\./){
           next;
        }
	if ($f !~ m/\.pdb/){
           next;
        }
        if ($f =~ m/model_vs_map$/ || $f =~ m/map_vs_model$/){
           push @FILES_LIST, $f;
        }
    }
    closedir (D);
    $count_files = 0;
    my $upload_manager = new  MultimerResultsEmmUploadManager();
    foreach my $file_name (@FILES_LIST) {
        $count_files ++;
        $upload_manager->upload_phenix($file_name, $directory);
        print "File #" . $count_files . "\n";
    }
}

sub upload_model_stat_results{
    $directory = $RESULT_DIR . "/map_vs_model/$TARGET";
    @FILES_LIST = ();
    opendir D, "$directory";
    while(defined(my $f = readdir(D))){
        if ($f =~ m/^\./){
           next;
        }
	if ($f !~ m/\.pdb/){
           next;
        }
        if ($f =~ m/model_vs_map$/){
           push @FILES_LIST, $f;
        }
    }
    closedir (D);
    $count_files = 0;
    my $upload_manager = new  MultimerResultsEmmUploadManager();
    foreach my $file_name (@FILES_LIST) {
        $count_files ++;
        $upload_manager->upload_model_stat($file_name, $directory);
        print "File #" . $count_files . "\n";
    }
}

sub upload_emringer_results{
    $directory = $RESULT_DIR . "/emringer/$TARGET";
    @FILES_LIST = ();
    opendir D, "$directory";
    while(defined(my $f = readdir(D))){
        if ($f =~ m/^\./){
           next;
        }
        if ($f !~ m/\.pdb/){
           next;
        }
        if ($f =~ m/emringer$/){
	#if ($f =~ m/score$/){i
           push @FILES_LIST, $f;
        }
    }
    closedir (D);
    $count_files = 0;
    my $upload_manager = new  MultimerResultsEmmUploadManager();
    foreach my $file_name (@FILES_LIST) {
        $count_files ++;
        $upload_manager->upload_emringer($file_name, $directory);
        print "File #" . $count_files . "\n";
    }
}

sub upload_chain_comparison{
    $directory = $RESULT_DIR . "/chain_comparison/$TARGET";
    @FILES_LIST = ();
    opendir D, "$directory";
    while(defined(my $f = readdir(D))){
        if ($f =~ m/^\./){
           next;
        }
        if ($f =~ m/chain_comparison$/){
           push @FILES_LIST, $f;
        }
    }
    closedir (D);
    $count_files = 0;
    my $upload_manager = new  MultimerResultsEmmUploadManager();
    foreach my $file_name (@FILES_LIST) {
        $count_files ++;
        $upload_manager->upload_chain_comparison($file_name, $directory);
        print "File #" . $count_files . "\n";
    }
}


sub upload_modelmap_match_results{
    $directory = $RESULT_DIR . "/PHENIX.modelmap_match/$TARGET";
    @FILES_LIST = ();
    opendir D, "$directory";
    while(defined(my $f = readdir(D))){
        if ($f =~ m/^\./){
           next;
        }
        if ($f =~ m/mmm$/){
           push @FILES_LIST, $f;
        }
    }
    closedir (D);
    $count_files = 0;
    my $upload_manager = new  MultimerResultsEmmUploadManager();
    foreach my $file_name (@FILES_LIST) {
        $count_files ++;
        $upload_manager->upload_modelmap_match($file_name, $directory);
        print "File #" . $count_files . "\n";
    }
}


sub upload_modelmap_match_results_str{
    $directory = $RESULT_DIR . "/PHENIX.modelmap_match.str/$TARGET";
    @FILES_LIST = ();
    opendir D, "$directory";
    while(defined(my $f = readdir(D))){
        if ($f =~ m/^\./){
           next;
        }
        if ($f =~ m/mmm$/){
           push @FILES_LIST, $f;
        }
    }
    closedir (D);
    $count_files = 0;
    my $upload_manager = new  MultimerResultsModelMatchUploadManager();
    foreach my $file_name (@FILES_LIST) {
        $count_files ++;
        $upload_manager->upload_modelmap_match($file_name, $directory);
        print "File #" . $count_files . "\n";
    }
}




sub run {
	my ($target_name) = @_;
	$TARGET = $target_name;

	printf "\n\n===== target: %8s =========\n", $TARGET;

	for my $action (split(',', $actions)) {
		printf "\n\n===== target: %8s action: %s =========\n", $TARGET, $action;
		switch ($action) {
		case 'tempy' {upload_TemPy_results();}
		case 'tempy_ov' {upload_TemPy_OV_scores();}
		case 'tempy_smoc' {upload_TemPy_smoc_results();}
		case 'tempy_ccc_mask' {upload_TemPy_ccc_mask();}
		case 'phenix' {upload_PHENIX_results(); upload_model_stat_results();}
		case 'emringer' {upload_emringer_results();}
		case 'modelmap_match' {upload_modelmap_match_results();}
		case 'modelmap_match_str' {upload_modelmap_match_results_str();}
		case 'chain_comp' {upload_chain_comparison();}
		}
	}

}

for my $target (split(',', $target_names)) {
	run($target);
}


exit(0);
1;
