#!/usr/bin/env python
# -*- coding: utf-8
"""Fetches information from the variable positions table"""

import sys
import argparse

import anvio

from anvio.errors import ConfigError, FilesNPathsError
from anvio.variabilityops import variability_engines


__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"


if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Extract information for variable positions')

    groupD = parser.add_argument_group('DATABASES', 'Declaring relevant anvi\'o databases. First things first.')
    groupS = parser.add_argument_group('SPLITS', 'Declaring relevant splits for the analysis. There are three\
                                                  ways to do it: 1) you can give a file path with split names,\
                                                  2) you can provide a collection id with a bin name, or 3)\
                                                  you can give a list or a file path containing gene caller\
                                                  ids.')
    groupO = parser.add_argument_group('OUTPUT', 'Output file and output style')
    groupE = parser.add_argument_group('EXTRAS', 'Parameters that will help you to do a very precise analysis.\
                                                  If you declare nothing from this bunch, you will get "everything"\
                                                  to play with, which is not necessarily a good thing...')

    groupS.add_argument(*anvio.A('splits-of-interest'), **anvio.K('splits-of-interest'))
    groupS.add_argument(*anvio.A('collection-name'), **anvio.K('collection-name'))
    groupS.add_argument(*anvio.A('bin-id'), **anvio.K('bin-id'))
    groupS.add_argument(*anvio.A('genes-of-interest'), **anvio.K('genes-of-interest'))
    groupS.add_argument(*anvio.A('gene-caller-ids'), **anvio.K('gene-caller-ids'))
    groupD.add_argument(*anvio.A('profile-db'), **anvio.K('profile-db'))
    groupD.add_argument(*anvio.A('contigs-db'), **anvio.K('contigs-db'))
    groupD.add_argument(*anvio.A('structure-db'), **anvio.K('structure-db', {"required": False}))
    groupO.add_argument(*anvio.A('output-file'), **anvio.K('output-file', {'default': 'variability.txt'}))
    groupO.add_argument(*anvio.A('samples-of-interest'), **anvio.K('samples-of-interest'))
    groupO.add_argument(*anvio.A('quince-mode'), **anvio.K('quince-mode'))
    groupO.add_argument(*anvio.A('include-contig-names'), **anvio.K('include-contig-names'))
    groupO.add_argument(*anvio.A('include-split-names'), **anvio.K('include-split-names'))
    groupO.add_argument(*anvio.A('compute-gene-coverage-stats'), **anvio.K('compute-gene-coverage-stats'))
    groupE.add_argument(*anvio.A('engine'), **anvio.K('engine'))
    groupE.add_argument(*anvio.A('num-positions-from-each-split'), **anvio.K('num-positions-from-each-split'))
    groupE.add_argument(*anvio.A('min-coverage-in-each-sample'), **anvio.K('min-coverage-in-each-sample'))
    groupE.add_argument(*anvio.A('min-departure-from-reference'), **anvio.K('min-departure-from-reference'))
    groupE.add_argument(*anvio.A('max-departure-from-reference'), **anvio.K('max-departure-from-reference'))
    groupE.add_argument(*anvio.A('min-departure-from-consensus'), **anvio.K('min-departure-from-consensus'))
    groupE.add_argument(*anvio.A('max-departure-from-consensus'), **anvio.K('max-departure-from-consensus'))
    groupE.add_argument(*anvio.A('min-occurrence-of-variable-positions'), **anvio.K('min-occurrence-of-variable-positions'))
    groupE.add_argument(*anvio.A('only-if-structure'), **anvio.K('only-if-structure'))

    args = anvio.get_args(parser)

    try:
        if args.engine not in variability_engines:
            raise ConfigError("You are doing something wrong :/ Focus '%s' does not correspond to an available engine." % args.engine)

        variability_engine = variability_engines[args.engine](args)
        variability_engine.process()
        variability_engine.report()
    except ConfigError as e:
        print(e)
        sys.exit(1)
    except FilesNPathsError as e:
        print(e)
        sys.exit(2)
