#!/usr/bin/perl

use Bio::Seq;
use Bio::SeqIO;

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

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

$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.".edit",
			      -format => "fasta");

$ctg_seq_out->write_seq($ctgOutSeq);

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

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

if ($reverse){
	@subSeq = split('', $ctgSubSeq[0]->seq.$orfSeq->seq);

	for($i=@subSeq-1; $i>=0; $i-=3){
		$codonRev = $subSeq[$i-2].$subSeq[$i-1].$subSeq[$i];
		if ($codonRev =~ /(TCA)|(CTA)|(TTA)/){
			$newOrfEnd = $i-1;
			last;
		}
	}
	$newOrfStart = $orfStart + $orfSeq->length - 1;	
	$newOrfSeq = Bio::Seq->new(-seq => $ctgOutSeq->subseq($newOrfEnd, $newOrfStart),
						-alphabet => "dna");
	
	$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)/){
			$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.".edit",
			      -format => "fasta");

$orf_seq_out->write_seq($newOrfSeq);

########################################################################
#### ATUALIZAR NO BANCO DE DADOS A TABELA orf PARA A ORF EM QUESTAO ####
########################################################################

$query = "UPDATE orf (start, end, length) VALUES (".$newOrfStart.", ".$newOrfEnd.", ".$newOrfSeq->length.") WHERE idMontagem=\'$mtg\' AND id=\'$idOrf\' ";

print "<BR>",$query;
print "<BR>",getFrame($newOrfStart, $newOrfEnd, ($newOrfStart < $newOrfEnd))."<BR>";

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;
}
