<?php
require ("lib/genopar.lib.php");
require ("lib/config.php");

if(!doAuth(LVLADM)) {
	$genopar->fechaPagina(); exit;
}

$genopar= new Genopar(__FILE__);
$orgsToBlast = array();

$genopar->abrePagina("Assembly Submission");

verGetPost(array("nomeMtg", "submit", "tipoArq", "orgsToBlast", "evalue", "runCOG", "runPFAM", "orfFinder", "startCodon", "minSize"));
// exit;
if (!$runCOG)
	$runCOG = 0;

if (!$runPFAM)
	$runPFAM = 0;

if (!$minSize)
	$minSize = 100;

if (
    !($submit && $nomeMtg && ($tipoArq == "fasta" && $_FILES['fastaFile']['name']) || ($tipoArq == "gbZip" && $_FILES['gbZipFile']['name']))
   ){
	   
// 	$codons = array('A','R','N','D','C','Q','E','G','H','I','L','K','M','F','P','S','T','W','Y','V');
// 	$startCodon = 'M';
	
	$genopar->abreForm();
	echo "<TABLE CELLSPACING=5 CELLPADDING=5 BORDER=1 RULES=ROWS FRAME=BOX>";
	echo "<TR>";
	echo "<TD>";
	echo "Assembly ID: ";
	echo "</TD>";
	echo "<TD>";
	$genopar->input("nomeMtg", "text", $nomeMtg, "", 30, 30);
	echo "</TD>";
	echo "</TR>";
	echo "<TR><TD></TD></TR>";
	echo "<TR>";
	echo "<TD>";
	$genopar->input("tipoArq", "radio", "fasta", "checked");
	echo " Assembly file (FASTA): ";
	echo "</TD>";
	echo "<TD>";
	$genopar->input("fastaFile", "file");
	echo "</TD>";
	echo "</TR>";
	echo "<TR>";
	echo "<TD>";
	$genopar->input("tipoArq", "radio", "gbZip");
	echo "Annotated assembly file (GenBank): ";
	echo "</TD>";
	echo "<TD>";
	$genopar->input("gbZipFile", "file");
	echo "</TD>";
	echo "</TR>";
	echo "<TD align=center colspan=2>";
	$genopar->submit();
	echo "</TD>";
	echo "</TABLE>";

	echo "<P>";
	echo "<TABLE CELLSPACING=5 CELLPADDING=5 BORDER=1 RULES=ROWS FRAME=BOX>";

	echo "<TR>";
	echo "<TH colspan=10 align=center>";
	echo "ORF Finder";
	echo "</TH>";
	echo "</TR>";

	echo "<TR>";
	echo "<TD>";
	$genopar->input("orfFinder", "radio", "glimmer", "checked");
	echo "</TD>";
	echo "<TD colspan=8 align=left>";
	echo "Glimmer";
	echo "</TD>";	
	echo "</TR>";


	echo "<TR><TD></TD></TR>";

	echo "<TR>";
	echo "<TD>";
	$genopar->input("orfFinder", "radio", "custom");
	echo "</TD>";
	echo "<TD colspan=2>";
	echo "Mark all";
	echo "</TD>";
	
	echo "<TD>";
	echo "Start Codon";
	echo "</TD>";
	echo "<TD colspan=2>";
// 	$genopar->select("startCodon", $codons, $startCodon);
	$codons = array('ATG', 'GTG', 'TTG', 'CTG', 'ATT');
	
	foreach ($codons as $codon){
		$genopar->input("startCodon[".$codon."]", "checkbox", $codon);
		echo "$codon&nbsp;";
	}
	
	echo "</TD>";
	echo "<TD>";
	echo "Minimum ORF size";
	echo "</TD>";
	echo "<TD colspan=2>";
	$genopar->input("minSize", "text", $minSize, "", 3, 5); echo "bases";
	echo "</TD>";
	echo "</TR>";	

	echo "</TABLE>";
	echo "</P>";

	echo "<P>";
	$genopar->mostraListaBact();
	echo "</P>";

	$genopar->fechaForm();

}elseif($tipoArq == "fasta"){

	$db_name = $genopar->MySQL_Default_DBname;

	$genopar->abreBanco();

	$n = $genopar->queryBanco("SELECT idMontagem FROM contig WHERE idMontagem='$nomeMtg'");
	if ($n > 0)
		$genopar->error("A file <i>$nomeMtg</i> already exist.");

	if ($runCOG == 1)
		$orgsToBlast['COG'] = 'COG';
	if ($runPFAM == 1)
		$orgsToBlast['PFAM'] = 'PFAM';
	
	$genopar->insertOrgsToBlast($nomeMtg, $orgsToBlast, $evalue);

	$size = 1 << 20; // size = 2^20 = 1 MB;
	$size = $size * 20; // size = 20 MB;
	$path = "tmp/";

	$genomaFasta = $path."/".$_FILES["fastaFile"]["name"];

	$fastaFile = $genopar->upload($_FILES["fastaFile"], $path, $size);

	if ($fastaFile){
		if (is_int($id)){
			foreach ($orgsToBlast as $id => $name){
				$n = $genopar->queryBanco("SELECT idOrg FROM orgsToBlast WHERE idOrg = '$id' AND idMontagem != '$nomeMtg'");
				if ($n > 0) continue;

				$orgDir = "BlastDatabases/$id";
				$ext = "faa";
				$localFile = "$orgDir/$id.$ext";
				
				if(!is_file($localFile)){
					$sql = "SELECT ftpFolder FROM taxonomy WHERE id=$id";
					$genopar->queryBanco($sql);
					$lin = $genopar->getArray();
					
					$orgFolder = $lin['ftpFolder'];				
					getFile($genopar, $id, $orgFolder, $ext);

					if (!is_file($localFile))
						$genopar->error("Nao foi possivel fazer o download do arquivo FASTA");

					$blastDB = formatDB($localFile);
					
				}
			}
		}
		if ($startCodon){
			$startCodon = join("|", $startCodon);
		}
// 		echo $startCodon;
// 		exit;
		system("cd autoAnnot && perl autoAnnot.pl $db_name $nomeMtg $fastaFile $orfFinder '$startCodon' $minSize");

 	}
 	
	$genopar->fechaBanco();

}else{
	$db_name = $genopar->MySQL_Default_DBname;

	$outAnnotDir = "Fasta/$nomeMtg";
	$outContigDir = "Fasta/$nomeMtg/Contigs";
	$outOrfDir = "Fasta/$nomeMtg/ORFs";

	$genopar->abreBanco();

	$n = $genopar->queryBanco("SELECT idMontagem FROM contig WHERE idMontagem='$nomeMtg'");
	if ($n > 0)
		$genopar->error("An assembly <i>$nomeMtg</i> already exist.");

	$genopar->fechaBanco();

	$zipFile = $_FILES['gbZipFile']['name'];
	$allowedMIME = array("application/x-gzip", "application/x-compressed", "application/x-gtar", "application/x-zip-compressed", "application/zip", "application/gzip");
	$size = 1 << 20; // size = 2^20 = 1 MB;
	$size = $size * 10; // size = 10 MB;
	$path = "tmp/";

	$file = $genopar->upload($_FILES["gbZipFile"], $path, $size, $allowedMIME);
	$dir = dirname($file);
// echo $file;
	if ($file){
		$list = unzip($file);
		if (is_array($list)){
			createTree($outAnnotDir);
// 			createDB($genopar, $dbName, $updateInfoAnnot, $DB_HOST, $DB_USER, $DB_PASS);
			$outDir = array_shift($list);

			foreach ($list as $file){
				$file = $outDir."/".$file;
				system("perl gbk2fna.pl $file $outContigDir");
				system("perl addAnnot.pl $file $nomeMtg $outOrfDir");
			}
		}elseif ($list === 1){
			$genopar->error("The compressed file must contain a root directory.");
		}
	}else{
		$genopar->error("This file type is not allowed.");
	}
	$ctgs = count($list);
	echo "<H2>$ctgs annotated contigs were added to the assembly <i>$nomeMtg</i></H2>";
}

?>
	<p>
	<pre>
	<h3>How to submit a set of contigs for automatic annotation</h3>
	
	1. "Assembly ID:" field - Add a name to identify the annotation analysis
	2. "Assembly file (FASTA):" field
	   - Generate one file containing all contigs in FASTA format
	3. "Annotated assembly file (GenBank):" field
	   + Generate one GenBank file per contig
	     - The contig ID will be extracted from the file name in the format:
	       - The prefix word "Contig"
	       - a number to identify the contig
	       - extensions ".gb" or ".gbk"
	     - Supported GenBank features are: CDS, gene, tRNA, product, and locus_tag
	   + Create a directory and move all contigs inside
	   + Compress the directory using "tar.gz" format
	4. Choose the file clicking the "Browse..." button
	5. Send informations using "Submit" button
	</pre>
	</p>
<?php

$genopar->fechaPagina();

/**
 * ******************** *
 *      FUNCOES		*
 * ******************** *
**/

# Conecta via FTP ao NCBI e baixa o arquivo "nome.ext"
function getFile($genopar, $idOrg, $folder, $ext){
	$ncbi = "ftp.ncbi.nih.gov";
	$USER = "anonymous";
	$PASS = "nada@lugar.algum";

	$con = ftp_connect($ncbi) or $genopar->error("NCBI indisponível.");
	ftp_login($con, $USER, $PASS);
	ftp_pasv($con, TRUE);
	
	ftp_chdir($con, "genomes/Bacteria/$folder") or $genopar->error("Nao foi possivel mudar de diretorio.");
	
	$pattern = "/.$ext$/";
	foreach(ftp_nlist($con, ".") as $file){
		if (preg_match($pattern, $file)){
			$rmtFile = $file;
			break;
		}
	}
	
	mkdir("BlastDatabases/$idOrg");
	
	$file = "BlastDatabases/$idOrg/$idOrg.$ext";
	$handle = fopen($file, "w");

	if (!ftp_fget($con, $handle, $rmtFile, FTP_ASCII, 0))
		$file = NULL;
	
	fclose($handle);
	ftp_close($con);

	return $file;
}

function formatDB($file){
	$dbName = substr($file, 0, -4);
	$formatDB = "/usr/local/blast/bin/formatdb -i $file -p T -n $dbName";

	system($formatDB);

	return $dbName;
}

function unzip($zipFile){
	$cmd = "tar -tf $zipFile";
	$outDir = dirname($zipFile);
	$content= array();
	exec($cmd, $content);
	if (preg_match("/\/$/", $content[0])){
// 		if (is_dir($outDir."/".$content[0])){
			$random = time();
			$rootDir = substr($content[0],0,-1);
			$outDir = $outDir."/".$rootDir.$random;
			mkdir($outDir);
			$content[0] = $outDir;
// 		}
		$cmd = "cd $outDir && tar -xzf $zipFile";
		exec($cmd);
// 		array_unshift($content, );
		return $content;
	}else{
		return 1;
	}
}

function createTree($root){
	mkdir($root);
		mkdir($root."/Contigs");
			mkdir($root."/Contigs"."/n");
			mkdir($root."/Contigs"."/p");
		mkdir($root."/ORFs");
			mkdir($root."/ORFs"."/n");
			mkdir($root."/ORFs"."/p");
}

?>
