#!/usr/bin/perl

# #Script responsavel por adicionar 
# Faz o parse e joga as informacoes para o Banco de Dados

use DBI;
use DBD::mysql;
use Bio::SearchIO;

use strict;

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

my $usage= "addBlastReports.pl <Nome do banco no mysql ex:ghdb > <nome do arquivo multiblast> <diretorio onde serao salvos os relatorios blast> <nome da montagem>  <nome do banco (nr|COG|PFAM)>\n";

my $DB_NAME = shift or die "DB_NAME:$usage\n";

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


my $infile = shift or die "infile:$usage\n";
my $blastDir= shift or die "blastDir:$usage\n";
my $nomeMontagem = shift or die "NomeMontagem:$usage\n";
my $dbName = shift or die "dbName:$usage\n";

our $TABLE_NAME = "blastp_$dbName";

############################ Cria arquivo individual para cara relatório blast

open(HANDLER, "<$infile") or die "Erro ao abrir!";
open(HANDLER2, "<$infile") or die "Erro ao abrir!";

my @lines;
my $nome;
my @arq;
my @backward;
my @backward;
my @lastRegrev;
my @lastReg;

@lines = <HANDLER>;

foreach my $line (@lines){
	
	if ($line=~/Query=/){
		chomp($line);
		($nome)=($line=~/Query= (.*).p/);
		$nome="ORF".$nome;
		#print "$nome\n";
	}
	if  ($line=~/BLASTP/){
		chomp($line);
		open(ARQ , ">$blastDir$nome.blast");
		print ARQ @arq;
		close ARQ;
		@arq = undef;
		 
	}
	push(@arq, $line);
}
@backward= reverse <HANDLER2>;

foreach my $revline (@backward){
last if  ($revline=~/BLASTP/);

	push(@lastRegrev, $revline);
	if ($revline=~/Query=/){
		chomp($revline);
		($nome)=($revline=~/Query= (.*).p/);
		$nome="ORF".$nome;
		
	}
}
push(@lastRegrev, "BLASTP");
@lastReg=reverse(@lastRegrev);
system("rm $blastDir/.blast");
open(ARQ , ">$blastDir$nome.blast");
	print ARQ @lastReg;
	close ARQ;

########################### BLASTs
opendir(DIR, $blastDir);
my @blastFiles = readdir(DIR);
closedir(DIR);

foreach my $blastFile (@blastFiles) {
	next if ($blastFile eq "." or $blastFile eq "..");
	my ($orfId)=($blastFile=~/(.*).blast/);
	my $in = new Bio::SearchIO(-format => 'blast', 
		                       -file   => $blastDir.$blastFile);

	my $result = $in->next_result;
	my $hit = $result->next_hit;
				if ($hit){
					my $hsp = $hit->next_hsp;
					my $subject = $hit->name;
					my $description = $hit->description;
					$description=~ s/\n/,/g;
					$description=~ s/://g;
					$description=~ s/'/-/g;
					my $score = $hit->score;
					my $hitStart = $hsp->start('hit');
					my $hitEnd = $hsp->end('hit');
					my $queryStart =  $hsp->start('query');
					my $queryEnd =  $hsp->end('query');

 				insereBD($dbh, $nomeMontagem, $orfId, $subject, "$description", $score, $hitStart, $hitEnd, $queryStart, $queryEnd);
#	print ("$nomeMontagem, $orfId, $subject, $description, $score, $hitStart, $hitEnd, $queryStart, $queryEnd\n");
#print "$orfId\n";
				}else{
					
					my $subject = '' ;
					my $description = '';
					my $score = 0;
					my $hitStart = 0;
					my $hitEnd = 0;
					my $queryStart =  0;
					my $queryEnd =  0;

 		insereBD($dbh, $nomeMontagem, $orfId, $subject, "$description", $score, $hitStart, $hitEnd, $queryStart, $queryEnd);
#	print ("$nomeMontagem, $orfId, $subject, $description, $score, $hitStart, $hitEnd, $queryStart, $queryEnd\n");
#print "$orfId\n";
	}
}
$dbh->disconnect;

#################################################

sub insereBD{
	my ($dbh, $nomeMontagem, $orfId, $subject, $description, $score, $hitStart, $hitEnd, $queryStart, $queryEnd) = @_;

	my ($id) = ($orfId =~ /ORF(.*)/);
	my $q = "INSERT INTO $TABLE_NAME VALUES (\'$nomeMontagem\', \'$id\', \'$subject\', \'$description\', $score, $hitStart, $hitEnd, $queryStart, $queryEnd)";

	$dbh->do($q);
}


