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

import sys

import anvio
import anvio.terminal as terminal

from anvio.errors import ConfigError, FilesNPathsError
from anvio.workflows.contigs import ContigsDBWorkflow
from anvio.workflows.metagenomics import MetagenomicsWorkflow
from anvio.workflows.pangenomics import PangenomicsWorkflow


__author__ = "Developers of anvi'o (see AUTHORS.txt)"
__copyright__ = "Copyleft 2015-2018, the Meren Lab (http://merenlab.org/)"
__license__ = "GPL 3.0"
__version__ = anvio.__version__
__maintainer__ = "Alon Shaiber"
__email__ = "alon.shaiber@gmail.com"


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

workflows_dict = {'contigs': ContigsDBWorkflow,
                  'metagenomics': MetagenomicsWorkflow,
                  'pangenomics': PangenomicsWorkflow}


def main(args):
    if args.list_workflows:
        run.info("Available workflows", ", ".join(list(workflows_dict.keys())))
        sys.exit(0)

    # FIXME: Meren and Alon should discuss these next lines
    # we can't call the snake_file_path from the class so I think
    # we have to do it this way
    if (not args.workflow) or (not args.config_file) and (not args.get_default_config):
        raise ConfigError("You must provide a workflow name AND a config file. You can use --list-workflow\
                           to learn what workflows are available, and you can use --get-default-config\
                           if you need help writing your config file.")

    M = workflows_dict[args.workflow](args)
    M.init()
    M.go()


if __name__ == '__main__':
    run.warning('If you publish results from this workflow, please do not forget to cite snakemake \
                 (doi:10.1038/nmeth.3176)', lc = 'yellow')

    import argparse
    parser = argparse.ArgumentParser(description="")

    groupA = parser.add_argument_group('ESSENTIAL INPUTS', "Things you must provide or this won't work")
    groupA.add_argument(*anvio.A("workflow"), **anvio.K("workflow"))

    groupB = parser.add_argument_group('ADDITIONAL STUFF', "additional stuff")
    groupB.add_argument(*anvio.A("get-default-config"), **anvio.K("get-default-config"))
    groupB.add_argument(*anvio.A("list-workflows"), **anvio.K("list-workflows"))
    groupB.add_argument(*anvio.A("list-dependencies"), **anvio.K("list-dependencies"))
    groupB.add_argument(*anvio.A("config-file"), **anvio.K("config-file"))
    groupB.add_argument(*anvio.A("dry-run"), **anvio.K("dry-run"))
    groupB.add_argument(*anvio.A("save-workflow-graph"), **anvio.K("save-workflow-graph"))
    groupB.add_argument(*anvio.A("additional-params"), **anvio.K("additional-params"))

    args = anvio.get_args(parser)

    try:
        main(args)
    except ConfigError as e:
        print(e)
        sys.exit(-1)
    except FilesNPathsError as e:
        print(e)
        sys.exit(-2)
