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

use Getopt::Long;
use Switch;

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

use LocalConfiguration;

use MultimerResultsManager;
use MultimerResultsUploadManager;


my $casp_version = uc($LOCAL_CONFIG->{CASP_VERSION});
my $RESULT_DIR = "/local/$casp_version/RESULTS/";

my $results_manager = new MultimerResultsManager();
my $resultsupload_manager = new MultimerResultsUploadManager();
my $target_names = "";
my $actions;
my $TARGET ;

# read arguments
GetOptions(
	"targets=s" => \$target_names,
	"actions=s" => \$actions,
);

sub upload_AssemblyAlignment {
    my $dir = "$RESULT_DIR/AA/CAPRI/" ;
    my $file = "$TARGET.aa";
    $resultsupload_manager->load_AssemblyAlignment($file, $dir);
}

sub upload_AssemblyProperties {
    my $dir = "$RESULT_DIR/AP/CAPRI/" ;
    my $file = "$TARGET.ap";
    $resultsupload_manager->load_AssemblyProperties($file, $dir);
}

sub upload_ananas {
    my $dir = "$RESULT_DIR/ananas/CAPRI/$TARGET" ;
    my $file = "$TARGET.SUMMARY";
    $resultsupload_manager->load_ananas($file, $dir);
}

sub upload_QSscore {
    my $dir = "$RESULT_DIR/QSscore/CAPRI/$TARGET/" ;
    my @files;
    opendir D, "$dir";
    while(defined( my $f = readdir(D))){
	if ($f =~ m/json$/){
		push @files, $f;
	}
    }
    closedir D;
    foreach my $f (sort @files){
	print "$f\n";
	$resultsupload_manager->load_QSscore($f, $dir);
    }
}

sub upload_cont_clash {
    my $dir = "$RESULT_DIR/oligo_cont_clash/CAPRI/" ;
    my $file = "$TARGET.cont_clash";
    $resultsupload_manager->load_cont_clash($file, $dir);
}

sub upload_interfaces {
    my $dir = "$RESULT_DIR/interfaces/CAPRI/" ;
    my $file = "$TARGET.scores_AB_iface-match";
    $resultsupload_manager->load_Interface($file, $dir);
}

sub upload_oligoModels{
    my $dir = "/local/$casp_version/predictions/cleaned/CAPRI/$TARGET" ;
    my @files = ();
    if (opendir(D, "$dir")) {
	while(defined(my $f = readdir(D))){
		push @files, $f unless $f=~ m/^\./ ;
	}
	closedir(D);
	@files = sort @files;
	foreach my $f (@files){
		$resultsupload_manager->load_OligoModels($f, $dir);
	}
    }
}

sub upload_stoich {
    my $dir = "/local/$casp_version/predictions/CAPRI/$TARGET" ;
    my @files = ();
    if (opendir(D, "$dir")) {
        while(defined(my $f = readdir(D))){
		if ($f =~ m/TS\d+_\d/ ){
                    push @files, $f ;
		}
        }
        closedir(D);
        @files = sort @files;
        foreach my $f (@files){
                $resultsupload_manager->load_Stoichiometry($f, $dir);
        }
    }
}



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 'aa' { upload_AssemblyAlignment(); } 
		case 'ap' { upload_AssemblyProperties(); }
		case 'iface' { upload_interfaces(); }
		case 'qs' { upload_QSscore(); }
		# case 'om' { upload_oligoModels(); } # obsolete : use upload_stoich() instead
		case 'cont_clash' { upload_cont_clash();} 
		case 'stoich' {upload_stoich();}
		case 'ananas' {upload_ananas();}
		}
	}

}

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

exit(0);
1;
