#!/usr/bin/perl -s
use File::Path;
use File::Basename;
require "MBGD_Conf.pl";
require 'libCGI.pl';
#require 'libMBGDUserInfo.pl';
use MBGD::WWW;
use UserInfo;

$| = 1;

$NJ=1;


if ($verbose) {
	$OUT = '';
} else {
	$OUT = '> /dev/null';
}
$www = MBGD::WWW->new;
$uInfo = $www->uInfo;
$maliParam = $uInfo->loadProperty("Property::MalignParam");
#$tmpfile  = "clusttmp$$";
$tmpfilename  = 'maliseq';
if ($main::DIR) {
    mktree("$main::DIR", 0, 0750) if (! -e $main::DIR);
    $tmpfile = "$main::DIR/$tmpfilename";
}
else {
    $uInfo->createUserDir();
    $tmpfile = $uInfo->getpath($tmpfilename);
}

if (@ARGV == 0) {
	while (<STDIN>) {
		chop;
		$ent = $_;
		if ($ent =~ /qry:/) {
			$QENT{$ent} = 1;
		} else {
			$ENT{$ent} = 1;
			if ($ent =~ /sp:/) {
				if (! $flag) {
##					@files = ($dpres, $spdpres);
					$flag = 1;
				}
			}
		}
	}
} else {
	foreach $ent (@ARGV) {
		if ($ent =~ /qry:/) {
			$QENT{$ent} = 1;
		} else {
			$ENT{$ent} = 1;
			if ($ent =~ /sp:/) {
				if (! $flag) {
##					@files = ($dpres, $spdpres);
					$flag = 1;
				}
			}
		}
	}
}
if (defined %QENT) {
	%Seq = $uInfo->getQuerySequenceAsHash;
}

#$entries = join(' ', (keys %ENT));
@entries = keys %ENT;

chdir("$DIR_tmp");

$dbname = $DBNAME_MBGD if ($DBNAME_MBGD);
if ($ENV{'MYSQL_DB'}) {
	$dbname = $ENV{'MYSQL_DB'};
($dbname) = ($dbname =~ /dbi:mysql:(.*)$/) if ($dbname =~ /dbi:mysql:/);
}
#$dbnameopt = "-dbname=$dbname";
push(@opt, "-dbname=$dbname");
if ($Nuc) {
	push(@opt, "-n");
} else {
	push(@opt, "-f");
}
print STDERR ">>$DBNAME_MBGD\n";
open(TMPOUT, ">&STDOUT");
open(STDOUT, ">$tmpfile");
print STDERR join(" ", "$CMD_mbget", @opt, @entries),"\n";
system("$CMD_mbget", @opt, @entries);
open(STDOUT, ">&TMPOUT");

foreach $qry (keys %QENT) {
	if ($Seq{$qry}) {
		$seq = $Seq{$qry};
	} else {
		$qry =~ s/qry://;
		$seq = $Seq{"$qry"};
	}
	system("cat >>$tmpfile <<EOF
$seq
EOF");
}

$SEQNUM = 0 + @entries + keys %QENT;
if ($Nuc) {
	$DISPALI_OPT .= " -N";
} else {
	$DISPALI_OPT .= " -P";
}
$DISPALI_OPT .= " -r60 -H -c -t20";

if ($cmd eq 'map') {
	if ($Nuc) {
		my $gapopen = $maliParam->getValue('map.gapopen_nt');
		my $gapext = $maliParam->getValue('map.gapext_nt');
		my $maxgapsiz = $maliParam->getValue('map.maxgapsiz');
		my $mismatch = $maliParam->getValue('map.mismatch');
		$mismatch = - $mismatch if ($mismatch > 0);
		my($cmd) = "$CMD_map $tmpfile $maxgapsiz $mismatch $gapopen $gapext > $tmpfile.out";
		system($cmd);
	} else {
		my $gapopen = $maliParam->getValue('map.gapopen');
		my $gapext = $maliParam->getValue('map.gapext');
		my $maxgapsiz = $maliParam->getValue('map.maxgapsiz');
		my $scoremat = $maliParam->getValue('map.scoremat');
##		system("$CMD_mapgapfilt $tmpfile| $CMD_map - 100 blosum50 8 1 f > $tmpfile.aln");
		my($cmd) = "$CMD_map $tmpfile $maxgapsiz $scoremat $gapopen $gapext f > $tmpfile.aln";
		system($cmd);
	}
	if ($Color) {
		my($cmd) = "$CMD_disp_align $tmpfile.aln $DISPALI_OPT";
		system($cmd);
	} else {
		open(CLUST, "$tmpfile.aln") || die;
		while (<CLUST>) {
			print;
		}
		close(CLUST);
	}
} elsif ($cmd eq 'mafft') {
	my $gapopen = $maliParam->getValue('mafft.gapopen');
	my $gapext = $maliParam->getValue('mafft.gapext');
	my $matrix = $maliParam->getValue('mafft.matrix');
	my $iterate = $maliParam->getValue('mafft.iterate');
	my($OPT);
	$OPT .= "-op $gapopen" if ($gapopen ne '');
	$OPT .= "-ep $gapext" if ($gapext ne '');
	$OPT .= "-bl $matrix" if ($matrix);
	$OPT .= "--maxiterate $iterate" if ($iterate);
	my($exec_dir) = File::Basename::dirname($tmpfile);
	my($tmpfile_name) = File::Basename::basename($tmpfile);
	chdir($exec_dir);
	my($cmd) = "$CMD_mafft $OPT $tmpfile_name > $tmpfile_name.aln";
	system($cmd);
	$cmd = "$CMD_disp_align $tmpfile_name.aln $DISPALI_OPT";
	system($cmd);
} else {
	my $gapopen = $maliParam->getValue('clustal.gapopen');
	my $gapext = $maliParam->getValue('clustal.gapext');
	my $quicktree = "-quicktree" if ($maliParam->getValue('clustal.quicktree'));
	my $matrix = $maliParam->getValue('clustal.matrix');
	my $gapdist = $maliParam->getValue('clustal.gapdist');
	$OPT .= "$quicktree -GAPOPEN=$gapopen -GAPEXT=$gapext -MATRIX=$matrix";
	$OPT .= " -GAPDIST=$gapdist" if ($gapdist);
	my($cmd) = "$CMD_clustalw -infile=$tmpfile $OPT $OUT";
#print STDERR ">>$cmd\n";
	system("$cmd");
	if (! $Color) {
		open(CLUST, "$tmpfile.aln") || die;
		while (<CLUST>) {
			print;
		}
		close(CLUST);
	} else {
		open(CLUST, "$CMD_clv2fs $tmpfile.aln | $CMD_disp_align $DISPALI_OPT|") || die;
		while (<CLUST>) {
			print;
		}
		close(CLUST);
	}
}

if (!$main::NO_NJTREE) {
    print "<FORM METHOD=POST ACTION=/htbin/createtree>\n";
    print "<INPUT TYPE=hidden NAME=alifile VALUE=\"$tmpfilename\">\n";
    print "Draw Tree (by ClustalW NJ tree)\n";
    print "Format: <SELECT NAME=format>\n";
    print "<OPTION VALUE=png>Image\n";
    print "<OPTION VALUE=postscript>PostScript\n";
    print "<OPTION VALUE=newick>Newick\n";
    print "<OPTION VALUE=newick_boot>Newick (bootstrap)\n";
    print "<OPTION VALUE=dist>Distmat\n";
    print "</SELECT>\n";
    print "Options:";
    print "<INPUT TYPE=checkbox NAME=tossgaps>exclude gapped pos.";
    print "<INPUT TYPE=checkbox NAME=kimura>Kimura's distance correction\n";
    print "<INPUT TYPE=submit NAME=\"NJ\" VALUE=\"Draw NJ Tree\">\n";
    print "</FORM>\n";
}
exit;

if ($NJ && -f "$tmpfile.aln") {
	system("$CMD_clustalw $tmpfile.aln -tree $OUT");
	rename("$tmpfile.ph", "$tmpfile.dnd");
}
if (open(TMP, "$tmpfile.dnd")) {
	my($tree);
	while (<TMP>){
		chop;
		$tree .= $_;
	}
	close(TMP);
    if ($tree && $SEQNUM > 2){
	print "<FORM METHOD=POST ACTION=/htbin/drawtree>\n";
	print "<INPUT TYPE=hidden NAME=tree VALUE=\"$tree\">\n";
	if ($NJ) {
		print "<INPUT TYPE=submit VALUE=\"Draw NJ Tree\">";
		if ($cmd eq 'map') {
			print " constructed by ClustalW, drawn ";
		}
		print "by DRAWTREE in Phylip package\n";
	} else {
		print "<INPUT TYPE=submit VALUE=\"Draw Tree\"> by DRAWTREE in Phylip package\n";
	}
    }
	unlink "$tmpfile.dnd";
}

unlink ("$tmpfile","$tmpfile.aln");
