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

import sys
import argparse

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

from anvio.errors import ConfigError, FilesNPathsError


__author__ = "Developers of anvi'o (see AUTHORS.txt)"
__copyright__ = "Copyleft 2015-2018, the Meren Lab (http://merenlab.org/)"
__credits__ = []
__license__ = "GPL 3.0"
__version__ = anvio.__version__
__maintainer__ = "A. Murat Eren"
__email__ = "a.murat.eren@gmail.com"
__requires__ = ['view-data',]
__provides__ = ['dendrogram',]
__description__ = "Takes a distance matrix, returns a newick tree."

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

def main(args):
    if not args.output_file:
        args.output_file = args.input_matrix + '.newick'

    run.info('Input matrix file', args.input_matrix)
    progress.new('Analyzing input file')
    clustering.create_newick_file_from_matrix_file(args.input_matrix, args.output_file, linkage=args.linkage,
                                    distance=args.distance, transpose=args.transpose, progress=progress,
                                    items_order_file_path=args.items_order_file)
    progress.end()
    run.info('Output newick', args.output_file)
    if args.items_order_file:
        run.info('Items order', args.items_order_file)


if __name__ == '__main__':
    parser = argparse.ArgumentParser(description=__description__)

    groupA = parser.add_argument_group('INPUT', 'The data you wish to cluster')
    groupA.add_argument('input_matrix', metavar='PATH', default=None,
                        help='Input matrix')

    groupB = parser.add_argument_group('OUTPUT', 'How would you like your results to be reported?')
    groupB.add_argument(*anvio.A('output-file'), **anvio.K('output-file'))
    groupB.add_argument('--items-order-file', metavar='FILE PATH', default=None,
                        help="In addition to a newick formatted output file, you can ask anvi'o to report\
                              the order of items in the resulting tree in a separate file. The content of\
                              this file will be a single-column item names the way they are ordered in the\
                              output newick dendrogram.")

    groupC = parser.add_argument_group('SWEETS', 'Additional options')
    groupC.add_argument(*anvio.A('transpose'), **anvio.K('transpose'))
    groupC.add_argument(*anvio.A('distance'), **anvio.K('distance'))
    groupC.add_argument(*anvio.A('linkage'), **anvio.K('linkage'))

    try:
        args = anvio.get_args(parser)
        main(args)
    except ConfigError as e:
        print(e)
        sys.exit(-1)
    except FilesNPathsError as e:
        print(e)
        sys.exit(-1)
