#!/usr/bin/perl

use DBI;
use DBD::mysql;
use Bio::Seq;
use Bio::SeqIO;

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

$mtg = shift;
$ctgFileName = shift;
$orfFileName = shift;
$orfStart = shift;
$orfEnd = shift;

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

($idOrf) = ($orfFileName =~ /([0-9]{4}\.[0-9]{4})\.fas/);
($idCtg) = ($idOrf =~ /([0-9]{4})\..*/);

$reverse = 0;
if ($orfStart > $orfEnd){
	$reverse = 1;
	
	$tmp = $orfStart;
	$orfStart = $orfEnd;
	$orfEnd = $tmp;
}

my $ctgSeq = Bio::SeqIO->new(-file => "<".$ctgFileName,
     	                     -format => "fasta");

$ctgSeq = $ctgSeq->next_seq();


my $orfSeq = Bio::SeqIO->new(-file => "<".$orfFileName,
     	                     -format => "fasta");

$orfSeq = $orfSeq->next_seq();
if ($reverse){
	$orfSeq = $orfSeq->revcom;
}

#### SALVAR CONTIG ####

my @ctgSubSeq;

$ctgSubSeq[0] = Bio::Seq->new(-seq => $ctgSeq->subseq(1,$orfStart-1),
						-alphabet => "dna");

$ctgSubSeq[1] = Bio::Seq->new(-seq => $ctgSeq->subseq($orfEnd + 1, $ctgSeq->length),
						-alphabet => "dna");

my $ctgOutSeq = Bio::Seq->new(-seq => $ctgSubSeq[0]->seq.$orfSeq->seq.$ctgSubSeq[1]->seq,
						-alphabet => "dna");
$ctgOutSeq->id($ctgSeq->id);

my $ctg_seq_out = Bio::SeqIO->new(-file   => ">".$ctgFileName,
			      -format => "fasta");

$ctg_seq_out->write_seq($ctgOutSeq);

$query = "UPDATE contig SET tam=".$ctgOutSeq->length." WHERE idMontagem='$mtg' AND id=$idCtg";
$dbh->do($query) or die "erro";

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

#### ENCONTRAR NOVO STOP CODON ####

if ($reverse){
	@subSeq = split('', $ctgSubSeq[0]->seq.$orfSeq->seq);
# print @subSeq;exit;
	for($i=@subSeq-1; $i>=0; $i-=3){
		$codonRev = $subSeq[$i-2].$subSeq[$i-1].$subSeq[$i];
		if ($codonRev =~ /(TCA)|(CTA)|(TTA)/i){
			$newOrfEnd = $i-1;
			last;
		}
	}
	$newOrfStart = $orfStart + $orfSeq->length - 1;	
	$newOrfSeq = Bio::Seq->new(-seq => $ctgOutSeq->subseq($newOrfEnd, $newOrfStart),
						-alphabet => "dna");
	
	$newOrfSeq = $newOrfSeq->revcom;
	$newOrfSeq->id($orfSeq->id);
}else{
	@subSeq = split('', $orfSeq->seq.$ctgSubSeq[1]->seq);

	for($i=0; $i<@subSeq; $i+=3){
		$codon = $subSeq[$i].$subSeq[$i+1].$subSeq[$i+2];
		if ($codon =~ /(TGA)|(TAG)|(TAA)/i){
			$newOrfEnd = $orfStart + $i+2;
			last;
		}
	}
	$newOrfStart = $orfStart;
	$newOrfSeq = Bio::Seq->new(-seq => $ctgOutSeq->subseq($newOrfStart, $newOrfEnd),
						-alphabet => "dna");
	$newOrfSeq->id($orfSeq->id);
}

my $orf_seq_out = Bio::SeqIO->new(-file   => ">".$orfFileName,
			      -format => "fasta");

$orf_seq_out->write_seq($newOrfSeq);

updateBaseStats($dbh, $mtg, $idOrf, $newOrfSeq);

########################################################################
#### ATUALIZAR NO BANCO DE DADOS A TABELA orf PARA A ORF EM QUESTAO ####
########################################################################
$newOrfFrame = getFrame($newOrfStart, $newOrfEnd, ($newOrfStart < $newOrfEnd));
$query = "
	UPDATE orf
	SET
		start = $newOrfStart,
		end = $newOrfEnd,
		length = ".$newOrfSeq->length.",
		frame = '$newOrfFrame'
	WHERE
		idMontagem='$mtg' AND
		id='$idOrf' ";

$dbh->do($query) or die "erro";

#### ATUALIZA TABELA rbs PARA ORF EM QUESTAO
$query = "
	UPDATE rbs
	SET
		start = $newOrfStart,
		stop = $newOrfEnd
	WHERE
		idMontagem='$mtg'	AND
		id='$idOrf' 		AND
		position > 0";

$dbh->do($query) or die "erro";

if ($reverse){
	$dif = $orfStart - $newOrfStart;
	$query = "
		UPDATE rbs
		SET
			position = position - $dif
		WHERE
			idMontagem='$mtg' AND
			id='$idOrf' 	  AND
			position > 0";

	$dbh->do($query) or die "erro";
}

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

sub getFrame{
	my ($start, $end, $strand) = @_;

	my $frame;
	if ($strand == 1){
		$frame = $start % 3;
		if ($frame == 0){
			$frame = 3;
		}
		$frame = "F".$frame;
	}else{
		$frame = $start % 3;
		if ($frame == 2){
			$frame = 3;
		}elsif ($frame == 0){
			$frame = 2;
		}
		$frame = "R".$frame;
	}

	return $frame;
}

sub updateBaseStats{
	my ($dbh, $mtg, $idCorf, $orfSeq) = @_;
	
	@seq = split('', $orfSeq->seq);
	
	%bases;
	$bases{'A'} = 0;
	$bases{'C'} = 0;
	$bases{'G'} = 0;
	$bases{'T'} = 0;
	$total = 0;
	
	foreach (@seq){
		$bases{$_}++;
	}
	
	$query = "
		UPDATE orf
		SET 
			bases_a = ".$bases{'A'}.",
			bases_c = ".$bases{'C'}.",
			bases_g = ".$bases{'G'}.",
			bases_t = ".$bases{'T'}."
		WHERE
			idMontagem='$mtg' AND
			id='$idOrf'
		";
		
	$dbh->do($query) or die "erro";
}
