#!/usr/bin/perl

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

use strict;

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

my $DB_NAME = shift;
my $mtg = shift;
my $contigFile = shift;
my $regionSize = shift;

if (!$regionSize){
	$regionSize = 200;
}

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

$contigSeq = $contigSeq->next_seq();

my $dbh = DBI->connect("DBI:mysql:$DB_NAME:$DB_HOST",$DB_USER,$DB_PASS,{RaiseError => 1});
my $q = "SELECT id, start, end FROM orf WHERE idMontagem='$mtg'";

my $n = $dbh->selectall_arrayref($q, { Slice => {} });

foreach my $res (@$n) {
	my $regionStart;
	my $regionEnd;
	my $regionSeq;

	my %actualStartCodon;

	#### FORWARD STRAND ####
	if ($res->{'start'} < $res->{'end'}){
		$regionStart = $res->{'start'} - $regionSize;
		if ($regionStart < 0){
			$regionStart = 0;
		}
	
		$regionEnd = $res->{'start'} + $regionSize;
		if ($regionEnd > $contigSeq->length){
			$regionEnd = $contigSeq->length;
		}
	
		$regionSeq = $contigSeq->subseq($regionStart, $regionEnd);

		$actualStartCodon{'codon'} = $contigSeq->subseq($res->{'start'}, $res->{'start'}+2);
	}
	#### REVERSE STRAND ####
	else{
		$regionStart = $res->{'start'} - $regionSize;
		if ($regionStart < 0){
			$regionStart = 0;
		}
	
		$regionEnd = $res->{'start'} + $regionSize;
		if ($regionEnd > $contigSeq->length){
			$regionEnd = $contigSeq->length;
		}
	
		$regionSeq = Bio::Seq->new(-seq => $contigSeq->subseq($regionStart, $regionEnd),
					   -alphabet => "dna");
	
		$regionSeq = $regionSeq->revcom->seq;

		my $startCodonSeq = Bio::Seq->new(-seq => $contigSeq->subseq($res->{'start'}-20, $res->{'start'}),
					          -alphabet => "dna");
		$actualStartCodon{'codon'} = $startCodonSeq->revcom->seq;
	}

	$actualStartCodon{'idMontagem'} = $mtg;
	$actualStartCodon{'idOrf'} = $res->{'id'};
	$actualStartCodon{'id'} = 1;
	$actualStartCodon{'orfStart'} = $res->{'start'};
	$actualStartCodon{'newStart'} = 0;
	$actualStartCodon{'position'} = $res->{'start'};

	insert($dbh, 'startCodons', %actualStartCodon);

	my @startCodons = searchStartCodons($regionSeq, $regionStart, $res->{'start'});
	my $id = 2;
	foreach my $codonInfo (@startCodons){
		$codonInfo->{'idMontagem'} = $mtg;
		$codonInfo->{'idOrf'} = $res->{'id'};
		$codonInfo->{'id'} = $id;
		$codonInfo->{'orfStart'} = $res->{'start'};
		$codonInfo->{'newStart'} = 0;

# 		insert($dbh, 'startCodons', %{$codonInfo});

		$id++;
	}
}

sub searchStartCodons($$$){
	my ($seq, $regionStart, $orfStart) = @_;

	my @codons = ('ATG', 'CTG', 'GTG', 'TTG');
	my @startCodons;

	foreach my $codon (@codons){
		my $offset = 0;
		my $result = index($seq, $codon, $offset);

		while ($result != -1) {
			if ($orfStart != $regionStart + $result){
				my %codonInfo;
				$codonInfo{'codon'} = $codon;
				$codonInfo{'position'} = $regionStart + $result;
				push(@startCodons, \%codonInfo);
			}
			$offset = $result + 1;
			$result = index($seq, $codon, $offset);
		}
	}
	return @startCodons;
}

sub insert{
	my ($dbh, $tableName, %data) = @_;

	my @table;my @value;my $q;my $tbl;my $vle;

	for my $k (keys %data){
		push @table, $k;
		push @value, $data{$k};
	}

	$q = "INSERT INTO $tableName ";
	$tbl = "(";
	$vle = " VALUES (";

	for (my $i=0; $i<@table; $i++){
		$tbl .= $table[$i].", ";
		$vle .= "\"".$value[$i]."\", ";
	}

	$tbl =~ s/,\s$/)/;
	$vle =~ s/,\s$/)/;

	$q .= $tbl.$vle;

# 	print $q."\n";

	$dbh->do($q);
}

sub in_array {
	my ($arr,$search_for) = @_;

	my $i=0;
	foreach my $value (@$arr) {
		return $i if $value eq $search_for;
		$i++;
	}
	return 0;
}
