#!/usr/bin/perl -w

# use strict;

my $DB_NAME = shift;
my $nomeMontagem = shift;
my $genomaFasta = shift;

# my $runCOG = shift;
# my $runPFAM = shift;

my $orfFinder = shift;
my $startCodon = shift;
my $minSize = shift;

our $DB_HOST;
our $DB_USER;
our $DB_PASS;
require '../lib/config.pl';

use DBI;
use DBD::mysql;

my $dbh = DBI->connect("DBI:mysql:$DB_NAME:$DB_HOST",$DB_USER,$DB_PASS,{RaiseError => 1});

my $sql = "SELECT o.idOrg, t.organism FROM orgsToBlast o, taxonomy t WHERE o.idMontagem='$nomeMontagem' AND o.idOrg = t.id";

$sth = $dbh->prepare($sql) or die "Cannot prepare: " . $dbh->errstr();
$sth->execute() or die "Cannot execute: " . $sth->errstr();

my @row;
my @fields;
while(@row = $sth->fetchrow_array()) {
	my @record = @row;
	push(@orgsToBlast, \@record);
}

my $sql = "SELECT o.idOrg FROM orgsToBlast o WHERE o.idMontagem='$nomeMontagem' AND (o.idOrg = 'COG' OR  o.idOrg = 'PFAM')";

$sth = $dbh->prepare($sql) or die "Cannot prepare: " . $dbh->errstr();
$sth->execute() or die "Cannot execute: " . $sth->errstr();

while(@row = $sth->fetchrow_array()) {
	my @record = @row;
	push(@orgsToBlast, \@record);
}

$sth->finish();

$dbh->disconnect;

mkdir "../Fasta/$nomeMontagem";

my $contigsOutDir = "../Fasta/$nomeMontagem/Contigs";
my $orfsOutDir = "../Fasta/$nomeMontagem/ORFs";

# system("perl createAnnotDB.pl $DB_NAME $nomeMontagem");

system("perl separaFastaGenoma.pl $DB_NAME $nomeMontagem $genomaFasta $contigsOutDir");

###### GLIMMER, RBS FINDER, TRNA SCANNER
opendir(DIR, $contigsOutDir."/n");
my @contigFiles = readdir(DIR);
closedir(DIR); 
foreach my $contigFile (@contigFiles) {
	next if ($contigFile eq "." or $contigFile eq "..");

	if ($orfFinder =~ /glimmer/i){
		system("perl orfPredict.pl $contigsOutDir/n/$contigFile");
	}elsif ($orfFinder =~ /custom/i){
		system("perl findAllORF.pl $contigsOutDir/n/$contigFile '$startCodon' $minSize");
		print("perl findAllORF.pl $contigsOutDir/n/$contigFile '$startCodon' $minSize");
# 		exit;
	}

	my ($contigId) = ($contigFile =~ /(\d+)/);

	system("perl separaFastaGenes.pl $DB_NAME $nomeMontagem genes.fas $contigId $orfsOutDir");

# 	if ($orfFinder =~ /glimmer/i){
		system("perl rodaRBSfinder.pl $DB_NAME $nomeMontagem $contigsOutDir/n/$contigFile genes.predict");
# 	}
	
# 	print $contigFile."\n";

	system("perl tRNAscan.pl $DB_NAME $nomeMontagem $contigsOutDir/n/$contigFile $contigId");
}

###### BLASTs
opendir(DIR, $orfsOutDir."/p");
my @orfFiles = readdir(DIR);
closedir(DIR);

my $blastOutDir = "../BlastReports/$nomeMontagem";
mkdir $blastOutDir;

foreach my $orfFile (@orfFiles) {
	next if ($orfFile eq "." or $orfFile eq "..");
	
	foreach my $org (@orgsToBlast){
		$blastOutDirOrg = $blastOutDir."/".@$org[0];
		
		$nomeOrganismo = @$org[1];
		$nomeOrganismo =~ s/'/\\'/g;
		
		mkdir $blastOutDirOrg;
		
		if (@$org[0] =~ /[0-9]+/){
			system("cd ../bin && perl runOrfsBlast.pl $DB_NAME $nomeMontagem $orfsOutDir/p/$orfFile ../BlastDatabases/".@$org[0]."/".@$org[0]." \"".$nomeOrganismo."\" $blastOutDirOrg");
		}elsif (@$org[0] =~ /COG/){
			system("cd ../bin && perl runOrfsBlastCOG.pl $DB_NAME $nomeMontagem $orfsOutDir/p/$orfFile $blastOutDir");
		}elsif (@$org[0] =~ /PFAM/){
			system("cd ../bin && perl runOrfsBlastPFAM.pl $DB_NAME $nomeMontagem $orfsOutDir/p/$orfFile $blastOutDir");
		}
	}
	
# 	system("cd ../bin && perl runOrfsBlast.pl $DB_NAME $nomeMontagem $orfsOutDir/p/$orfFile ../BlastDatabases/nr nr $blastOutDir");

# 	if ($runCOG){
# 		system("cd ../bin && perl runOrfsBlastCOG.pl $DB_NAME $nomeMontagem $orfsOutDir/p/$orfFile $blastOutDir");
# 	}
# 	
# 	if ($runPFAM){
# 		system("cd ../bin && perl runOrfsBlastPFAM.pl $DB_NAME $nomeMontagem $orfsOutDir/p/$orfFile $blastOutDir");
# 	}
}
