package QADiff2bestUploadManager;

use strict;
use warnings;

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

use Database;

use Configuration;
use LocalConfiguration;

use QADiff2bestManager;

my $upload_manager = undef;

my $MODEL_FORMAT = "stage(\\d{1})";
my $SCORE_FORMAT = "_(gdt|cadss|cadaa|sg|lddt)[_-]";

sub new {
    my ($class) = @_;
    return $upload_manager if (defined($upload_manager));
    my $self = { };
    $upload_manager = bless $self, $class;
    return $upload_manager;    
}


sub parseDirName {
    my ($self, $dirname) = @_;
    my $model = undef;
    my $score = undef;
    if ($dirname =~ m/$MODEL_FORMAT/){
	my $m = $1;
	$model = $m;
    }
    if ($dirname =~ m/$SCORE_FORMAT/) {
	$score = $1;
	if ($score =~ m/gdt/) {
	    $score = 'diff_gdt_ts';
	} elsif ($score =~ m/cadss/){
	   $score = 'diff_cad_ss';
	} elsif ($score =~ m/cadaa/){
           $score = 'diff_cad_aa';
        } elsif ($score =~ m/lddt/){
           $score = 'diff_lddt';
        } elsif ($score =~ m/sg/){
           $score = 'diff_sg';
        }
    }
    return ($model, $score);
}


sub upload_results{
    my ($self, $file, $dir) = @_;
    my $infile = sprintf("%s/%s", $dir, $file);
    my ($mod, $score) = $self->parseDirName($dir);
    my $manager = new QADiff2bestManager();
    if (open IN, "< $infile") {
	my $l = <IN>; # skip header
	while ($l = <IN>){
		my %model = $manager->get_new_model();
		$model{model} = $mod;
		# group_name gr_num  targ  MQA   gdt    Best_gdt  diff
		# ModFOLD6   201     T0860 0.553 77.941 77.941    0.00000
		my @tokens = split(/\s+/, $l);
		$model{gr_name} = $tokens[0];
		$model{gr_code} = $tokens[1];
		$model{target} = $tokens[2];
		$model{$score} = $tokens[$#tokens];
		if ($score =~ m/cad/ || $score =~ m/lddt/){
			$model{$score} *= 100.0;
		}
		my $id = $manager->exist_by_parameters(%model);
		if (defined($id) && $id > 0){
			$model{id} = $id;
			$manager->update(%model);
		} else {
			$manager->add(%model);
		}
	}
	close (IN);
    } else {
       warn "Couldn't open file $infile\n";
    }

}

1;
