#!/usr/bin/perl -w
use strict;

use db_link;
use projects;

my @arg_pairs = split (/\-/, (join ' ', @ARGV));
my %args=();
my @unigene_build_ids;
foreach (@arg_pairs){
	$_ or next;
	my ($flag, @val)=split /\s+/;
	if ($flag eq 'b') {
		@unigene_build_ids=@val;
	}
	$args{$flag}=$val[0];
}
my $project=$args{'p'};
my $set=$args{'b'};
my $lib=$args{'l'};
my $outdir=$args{'o'};

$project or die "You must set the project with the -p flag.\n";
if (!$set && !$lib) {
	die "You must select the unigene build IDs with the -b flag, and/or the libraries with the -l flag (-l all to process all libraries).\n";
}

$outdir ||= "/data/shared/pgn_data_processing/blast_annotations/${project}/00_fasta";
my $outfile = "unigene_build";

my ($db,$usr) = @{projects::get_db_info($project)};
$db or die "No known database for project $project";

my $dbh = db_link::connect_db($db,$usr) or die "couldn't open database link!\n";

foreach my $id (@unigene_build_ids) {

	print STDERR "Getting build nr $id...\n";
	my $seqcount = 0;
	open (F, ">${outdir}/${outfile}_$id.fasta") || die "Can't open ${outdir}/${outfile}_$id.fasta";

	# get unigene assemblies
	my $query = "SELECT unigenes.unigene_id, unigene_assembly_sequence.sequence_data 
	FROM unigenes, unigene_assembly_sequence 
	WHERE unigenes.unigene_element_id=unigene_assembly_sequence.unigene_assembly_id and unigenes.unigene_build_id=$id and unigenes.unigene_element_type_id=1 order by unigene_id";

	my $sth = $dbh -> prepare($query);

	$sth -> execute();

	while (my ($unigene_id, $sequence) = $sth -> fetchrow_array()) {
		print F ">$unigene_id\n$sequence\n";
		$seqcount++;
	}

	# get unigene singletons
	my $query2 = "SELECT unigenes.unigene_id, trimmed_sequence.sequence_data
	FROM unigenes, unigene_singleton, trimmed_sequence
	WHERE unigenes.unigene_element_id=unigene_singleton.unigene_singleton_id and unigene_singleton.trimmed_seq_id=trimmed_sequence.trimmed_seq_id and unigenes.unigene_element_type_id=2 and unigenes.unigene_build_id=$id order by unigene_id";

	my $sth2 = $dbh -> prepare($query2);

	$sth2 -> execute();

	while (my ($unigene_id, $sequence) = $sth2 -> fetchrow_array()) {
		print F ">$unigene_id\n$sequence\n";
		$seqcount++;
	}

	close (F);
	print STDERR "Wrote $seqcount sequences to ${outdir}/${outfile}_$id.fasta.\n";
}

if ($lib) {

# process libraries
	my ($seq_id, $trimmed_seq_id, $seq);

	my $stm = "select distinct ts.seq_id, ts.trimmed_seq_id, ts.sequence_data from trimmed_sequence as ts, quality_evaluation as q";
	unless ($lib eq 'all'){
		$stm .=", est_info as e, est_library as l where ts.seq_id=e.seq_id and e.est_library_id=l.est_library_id and l.library_name like '$lib%'";
	}
	if ($lib eq 'all'){
		$stm .= " where ";
	}
	else {
		$stm .= " and ";
	}
	$stm .= " ts.trimmed_seq_id=q.trimmed_seq_id and q.qual_criteria_id='6'";

	my $sth = $dbh->prepare($stm) or die "Can't prepare statement: $DBI::errstr";
	my $rv = $sth->execute or die "Can't execute statement: $DBI::errstr";
	my $rc = $sth->bind_columns(\$seq_id, \$trimmed_seq_id, \$seq);

	open (SEQ_OUT, ">${outdir}/$lib.fasta");

	while ($sth->fetch){
		print SEQ_OUT ">${seq_id}::${trimmed_seq_id}\n$seq\n";
	}

	close SEQ_OUT;

}

db_link::disconnect_db($dbh);

