#!/usr/bin/perl 

use strict;
use warnings;

###########################################################
#
# The script fixes file names in predictions/cleaned/ direc-
# tory. The name of the files in format "GROUPNAME_TS1" ->
# "T0647TS123_1"
# Script doesn't work with oligomeric predictions in dir T0647o
# It is necesary to fix manually these cases.
#
###########################################################

use lib ("/local/Projects/Perl/casp13/src/Classes");
use lib ("/local/Projects/Perl/casp13/src/Classes/Core");

use GroupsManager;
use LocalConfiguration; 


my $grp_manager = new GroupsManager();

#my $inFile = "/data/CASP13/tmp_QA/T0644.150best.txt";
my $inFile = "/data/CASP13/predictions/tmp_cleaned/T0654.all.txt";

my @models = ();

open INFILE,"< $inFile";
while(<INFILE>){
  chomp $_;
  push(@models, $_);
}
close(INFILE);

my @predictions = ();

my $target;
foreach my $model (@models){
	if($model =~ m/(T[0-9]{4})(TS)([0-9]{3})_([1-5]{1})/){
		 $target = $1 if (!defined($target));
		my $pfrmat = $2;
		my $code = $3;
		my $model = $4;
		my $grp_id = $grp_manager->get_id_by_code($code);
		my $grp_name = $grp_manager->name($grp_id);
		if($grp_manager->is_server($grp_id)){
		 push(@predictions,
		 { _group_name=>$grp_name,
		   _model => $model,
		   _group_code => $code,
		   _prfrmat => $pfrmat
	 		});
		}
	}   
}

foreach my $pred (@predictions){
 print sprintf("%s %s %s %s \n",$pred->{_group_name}, $pred->{_group_code}, $pred->{_prfrmat}, $pred->{_model}  );
}
print $target."\n";
&create_tarballs_all($target, \@predictions);
#&create_tarballs_stage2($target, \@predictions);
exit;

exit;
sub create_tarballs_stage2{
    my ($target, $ref_predictions) = @_;

        my @predictions = @{$ref_predictions};
        # sort @predictions alphabetically
        @predictions = sort {$a->{_group_name} cmp $b->{_group_name} } @predictions;

        my $tarball_name = sprintf("%s.stage2.3D.srv.tar.gz", $target);

        my $download_area = sprintf("/data/".$LOCAL_CONFIG->{CASP_VERSION}."/tmp_QA/%s", $tarball_name);
        if (!(-e $download_area)) {
              my $new_dir = sprintf("%s/%s", $LOCAL_CONFIG->{TARBALLS_PREDICTIONS_DIR}, $target);
              my $old_dir = sprintf("%s/%s", $LOCAL_CONFIG->{CLEAN_PREDICTIONS_DIR}, $target);
              if(!(-e $new_dir)) {
                  system(sprintf("mkdir %s", $new_dir));
                  system(sprintf("chgrp casp %s", $new_dir));
                  system(sprintf("chmod 775 %s", $new_dir));
              }

              for(my $p_count = 0; $p_count < scalar(@predictions); $p_count++) {
                  my $new_file = sprintf("%s/%s_%s%s%s", $new_dir, $predictions[$p_count]->{_group_name}, $predictions[$p_count]->{_prfrmat}, $predictions[$p_count]->{_model}, (($predictions[$p_count]->{_prfrmat} eq 'AL')?'.pdb':''));
                   my $old_file = sprintf("%s/%s%s%s_%s", $old_dir, $target, $predictions[$p_count]->{_prfrmat}, $predictions[$p_count]->{_group_code}, $predictions[$p_count]->{_model});

                  system(sprintf("cp %s %s", $old_file, $new_file));
                  system(sprintf("chmod a+r %s", $new_file))
              }

              system(sprintf("cd %s; tar -czf %s %s/* --remove-files", $LOCAL_CONFIG->{TARBALLS_PREDICTIONS_DIR}, $tarball_name, $target));
              system(sprintf("chgrp casp %s/%s",$LOCAL_CONFIG->{TARBALLS_PREDICTIONS_DIR}, $tarball_name));
              system(sprintf("chmod 664 %s/%s",$LOCAL_CONFIG->{TARBALLS_PREDICTIONS_DIR}, $tarball_name));

              system(sprintf("mv %s/%s %s", $LOCAL_CONFIG->{TARBALLS_PREDICTIONS_DIR}, $tarball_name, $download_area));
              system(sprintf("rm -f -r %s/%s ", $LOCAL_CONFIG->{TARBALLS_PREDICTIONS_DIR}, $target));
       }

        return 1;
}


sub create_tarballs_all{
    my ($target, $ref_predictions) = @_;

        my @predictions = @{$ref_predictions};
        # sort @predictions alphabetically
        @predictions = sort {$a->{_group_name} cmp $b->{_group_name} } @predictions;

        my $tarball_name = sprintf("%s.3D.srv.tar.gz", $target);

       # my $download_area = sprintf("/www/download_area/".$LOCAL_CONFIG->{CASP_VERSION}."/server_predictions/%s", $tarball_name);
	my $download_area = sprintf("/data/".$LOCAL_CONFIG->{CASP_VERSION}."/tmp_QA/%s", $tarball_name);
        if (!(-e $download_area)) {
              my $new_dir = sprintf("%s/%s", $LOCAL_CONFIG->{TARBALLS_PREDICTIONS_DIR}, $target);
              my $old_dir = sprintf("%s/%s", "/data/".$LOCAL_CONFIG->{CASP_VERSION}."/predictions/tmp_cleaned/", $target);
              if(!(-e $new_dir)) {
                  system(sprintf("mkdir %s", $new_dir));
                  system(sprintf("chgrp casp %s", $new_dir));
                  system(sprintf("chmod 775 %s", $new_dir));
              }

              for(my $p_count = 0; $p_count < scalar(@predictions); $p_count++) {
                  my $new_file = sprintf("%s/%s_%s%s%s", $new_dir, $predictions[$p_count]->{_group_name}, $predictions[$p_count]->{_prfrmat}, $predictions[$p_count]->{_model}, (($predictions[$p_count]->{_prfrmat} eq 'AL')?'.pdb':''));
                   my $old_file = sprintf("%s/%s%s%s_%s", $old_dir, $target, $predictions[$p_count]->{_prfrmat}, $predictions[$p_count]->{_group_code}, $predictions[$p_count]->{_model});

                  system(sprintf("cp %s %s", $old_file, $new_file));
                  system(sprintf("chmod a+r %s", $new_file))
              }

              system(sprintf("cd %s; tar -czf %s %s/* --remove-files", $LOCAL_CONFIG->{TARBALLS_PREDICTIONS_DIR}, $tarball_name, $target));
              system(sprintf("chgrp casp %s/%s",$LOCAL_CONFIG->{TARBALLS_PREDICTIONS_DIR}, $tarball_name));
              system(sprintf("chmod 664 %s/%s",$LOCAL_CONFIG->{TARBALLS_PREDICTIONS_DIR}, $tarball_name));

              system(sprintf("mv %s/%s %s", $LOCAL_CONFIG->{TARBALLS_PREDICTIONS_DIR}, $tarball_name, $download_area));
              system(sprintf("rm -f -r %s/%s ", $LOCAL_CONFIG->{TARBALLS_PREDICTIONS_DIR}, $target));
       }

        return 1;
}

