#!/usr/bin/perl

use strict;
use warnings;

use lib qw(Core);
use Database;

use Configuration;


###########################################################
#
# The script verifies the consistency of the models in directory
# cleaned and in directory MODELS
#
###########################################################

my $clDIR = "/local/CASP13/predictions/cleaned";
my $mdlDIR = "/local/CASP13/MODELS";
my %SERVERS;
my %SERV_GROUPS;
my $db = Database->new($CONFIG->{HOSTNAME}, $CONFIG->{PORT}, $CONFIG->{DATABASE}, $CONFIG->{USERNAME}, $CONFIG->{PASSWORD});

my @targets = &readTargets();
&getServerTargets();
&getServerGroups();


foreach my $t (@targets){
#   print $t."\n";
   &verifyPerTarget($t);
}


sub verifyPerTarget{
   my $t = shift;
   my @missing;
   opendir D, "$clDIR/$t";
   while(defined(my $m = readdir(D))){
	if ($m =~ m/^((T[0Racspx][0-9]{3})TS([0-9]{3})_[1-5])/){
		my $gr_code = $3; $gr_code = sprintf("%03d", $gr_code);
		if (exists($SERVERS{$t}) && !(exists($SERV_GROUPS{$gr_code}))){
			next;
		}
#		print "$1\t$2\n";next;
		my $n = `ls -1 $mdlDIR/$2/$1* | wc -l`;
		if ($n == 0){
			print $m."\n";
		} else {
#			print "yes: $m\n";
		}
	}
   }
   closedir D;
}



sub readTargets{
    opendir D, "$clDIR";
    my @targets;
    while(defined(my $f = readdir(D))){
	if ($f =~ m/^\./) {next;}
	if (! -d "$clDIR/$f") {next;}
	if ($f !~ m/^T[0Racspx][0-9]{3}$/){next;}
	push @targets, $f;
    }
    closedir D;
    return (sort @targets);
}

sub getServerTargets{
    my $query = "SELECT DISTINCT  name FROM casp13.targets WHERE is_server_only=1 ORDER BY name";
    my $sth = $db->query($query);
    if (defined($sth) && ($sth->rows() > 0)){
	while(my ($target) = $sth->fetchrow_array()){
#		print $target."\n";
		$SERVERS{$target} = 1;
	}
    }
}


sub getServerGroups{
    my $query = "SELECT DISTINCT code FROM casp13.groups WHERE type>0 ORDER BY code";
    my $sth = $db->query($query);
    if (defined($sth) && ($sth->rows() > 0)){
        while(my ($gr_code) = $sth->fetchrow_array()){
                $SERV_GROUPS{sprintf("%03d",$gr_code)} = 1;
        }
    }
}
