#!/usr/bin/env python
# -*- coding: utf-8

import sys
import argparse

import anvio
import anvio.dbops as dbops
import anvio.terminal as terminal
import anvio.clustering as clustering

from anvio.errors import ConfigError, FilesNPathsError
from anvio.clusteringconfuguration import ClusteringConfiguration


__author__ = "A. Murat Eren"
__copyright__ = "Copyright 2015, The anvio Project"
__credits__ = []
__license__ = "GPL 3.0"
__version__ = anvio.__version__
__maintainer__ = "A. Murat Eren"
__email__ = "a.murat.eren@gmail.com"
__status__ = "Development"


run = terminal.Run()
progress = terminal.Progress()

parser = argparse.ArgumentParser(description='why yes we do stuff here.')
parser.add_argument('config_file', metavar = 'PATH', default = None, type=str,
                    help = 'Config file for clustering of contigs. See documentation for help.')
parser.add_argument('-i', '--input-directory', metavar = 'INPUT_DIR', default = None, type=str,
                    help = 'Input directory where the input files can be found')
parser.add_argument('-a', '--annotation-db', default = None, metavar = 'ANNOTATION_DB',
                    help = 'anvio annotation database.', required = True)
parser.add_argument('-p', '--profile-db', default = None, metavar = 'PROFILE_DB',
                    help = 'anvio annotation database.', required = False)
parser.add_argument('-o', '--output-file', metavar = 'FILE', default = None, type=str,
                    help = 'To store the newick output/')
parser.add_argument('-D', '--dry-run', default = False, action = 'store_true', 
                    help = 'Do not do anything, just print out the configuration.')

args = parser.parse_args()


try:
    split_names = []
    if args.profile_db:
        profile_db = dbops.ProfileDatabase(args.profile_db)
        if int(profile_db.meta['merged']):
            split_names = profile_db.db.get_single_column_from_table('mean_coverage_splits', 'contig')
        else:
            split_names = profile_db.db.get_single_column_from_table('metadata_splits', 'contig')
        profile_db.disconnect()

    db_paths = {'ANNOTATION.db': args.annotation_db}
    config = ClusteringConfiguration(args.config_file, args.input_directory, db_paths = db_paths, row_ids_of_interest = split_names)
except ConfigError, e:
    print e
    sys.exit(-1)
except FilesNPathsError, e:
    print e
    sys.exit(-2)

config.print_summary(run)

if args.dry_run:
    sys.exit()

newick = clustering.order_contigs_simple(config, progress = terminal.Progress(), debug = True)

if args.output_file:
    open(args.output_file, 'w').write(newick + '\n')
    run.info('Output', args.output_file, mc='green')
