#!/usr/bin/perl -w
use strict;
use File::Basename;
use Getopt::Std;
my $PROGRAM = basename $0;
my $USAGE=
"Usage: $PROGRAM
-r: align by region
-R: align only region
-d: domain by domain
";
# -D SEQ_DB

use DomRefine::Read;
use DomRefine::Refine;
use DomRefine::Tree;
use DomRefine::Score;

### Settings ###
my %OPT;
getopts('rRdD:', \%OPT);

if ($OPT{D}) {
    $ENV{'DOMREFINE_SEQ_DB'} = $OPT{D};
}

my $TMP_INPUT = define_tmp_file("$PROGRAM.input");
my $TMP_ALIGNMENT = define_tmp_file("$PROGRAM.alignment");
my $TMP_ALIGNMENT_ERR = define_tmp_file("$PROGRAM.alignment.err");
my $TMP_TREE = define_tmp_file("$PROGRAM.ph");
my $TMP_TREE_LOG = define_tmp_file("$PROGRAM.tree_log");
END {
    remove_tmp_file($TMP_INPUT);
    remove_tmp_file($TMP_ALIGNMENT);
    remove_tmp_file($TMP_ALIGNMENT_ERR);
    remove_tmp_file($TMP_TREE);
    remove_tmp_file($TMP_TREE_LOG);
}

### Main ###
-t and die $USAGE;
save_stdin($TMP_INPUT);

my @GENE = ();
create_alignment($TMP_INPUT, \@GENE, $TMP_ALIGNMENT, region => $OPT{r}, REGION => $OPT{R}, DOMAIN => $OPT{d});

phylogenetic_tree($TMP_ALIGNMENT, $TMP_TREE, $TMP_TREE_LOG);

### tree_minimize ###
my $TREE = create_tree($TMP_TREE);
my @NODES = $TREE->get_root_node->get_all_Descendents;
my $IDX = find_min_tree($TMP_TREE, \@NODES);
$TREE->reroot_at_midpoint($NODES[$IDX]);

print "#Newick\t";
print_tree(\$TREE);

### score ###
my $DCLST = divide_tree($TMP_INPUT, $TMP_TREE, $IDX);
my ($score, $n_seq, $n_aa2) = score_one_c(merge_all($DCLST));
my ($score_between) = score_one_c($DCLST, between => 1);
my $normalized_score_between = $score_between /($n_seq*$n_aa2);
my $relative_score_between = $score_between / $score;

print "#Score\t$score_between\t$normalized_score_between\t$relative_score_between\n";

print tree_children($TREE->get_root_node, 0);
