#!python

# Copyright (C) 2017, Weizhi Song, Shan Zhang and Torsten Thomas.
# songwz03@gmail.com, shan.zhang@unsw.edu.au and t.thomas@unsw.edu.au

# MetaCHIP2 is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.

# MetaCHIP2 is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Affero General Public License for more details.

# You should have received a copy of the GNU Affero General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.


import sys
import argparse
import warnings
from MetaCHIP2.MetaCHIP2_config import config_dict


def version(config_dict):
    version_file = open('%s/VERSION' % config_dict['config_file_path'])
    return version_file.readline().strip()


def print_main_help():

    help_message = ''' 
           ...::: MetaCHIP2 v%s :::...
    
    Core module 
       detect   ->  Detect HGT
    
    Supplementary modules
       prokka   ->  (to be added) Run Prokka in batch manner
       infer    ->  Infer species tree using gtdbtk
       root     ->  Root species tree by GTDB taxonomy
       circos   ->  (to be added) Visualize HGTs with circos plot 
       enrich   ->  (to be added) Enrichment of COG functions in HGTs 
    
    # Upgrade to the latest version with: pip3 install --upgrade MetaCHIP2
    ''' % version(config_dict)

    print(help_message)


if __name__ == '__main__':

    ############################################## initialize subparsers ###############################################

   # initialize the options parser
    parser = argparse.ArgumentParser()
    subparsers = parser.add_subparsers(help="--", dest='subparser_name')
    warnings.filterwarnings('ignore')

    # parse options
    if (len(sys.argv) == 1) or (sys.argv[1] in ['-h', '-help', '--help', '-H', '-Help', '--Help']):
        print_main_help()
        sys.exit(0)

    elif sys.argv[1] == 'detect':
        from MetaCHIP2 import detect
        detect_parser = subparsers.add_parser('detect', description='detect HGT', usage=detect.detect_usage)
        detect_parser.add_argument('-p', required=True,                         help='output prefix')
        detect_parser.add_argument('-i', required=True,                         help='input gbk folder')
        detect_parser.add_argument('-x', required=False, default='gbk',         help='gbk file extension， default: gbk')
        detect_parser.add_argument('-s', required=True,                         help='species tree of input genomes')
        detect_parser.add_argument('-c', required=False, default=None,          help='taxonomic classification of input genomes')
        detect_parser.add_argument('-r', required=False, default=None,          help='grouping rank, e.g., p, c, o, f, g, pcofg or pco...')
        detect_parser.add_argument('-g', required=False, default=None,          help='grouping file')
        detect_parser.add_argument('-o', required=False, default=None,          help='output folder (default: current working directory)')
        detect_parser.add_argument('-b', required=False, default=None,          help='all-vs-all blastn results (e.g., from a previous run)')
        detect_parser.add_argument('-m', required=False, action="store_true",   help='speed-up all-vs-all blastn using mmseqs')
        detect_parser.add_argument('-v', required=False, action="store_true",   help='skip plotting flanking regions')
        detect_parser.add_argument('-e', required=False, action="store_true",   help='skip end-break and contig-match check, not recommend for metagenome-assembled genomes')
        detect_parser.add_argument('-t', required=False, type=int, default=1,   help='number of threads, default: 1')
        detect_parser.add_argument('-tmp', required=False, action="store_true", help='keep temporary files')
        detect_parser.add_argument('-q', required=False, action="store_true",   help='do not report progress')
        detect_parser.add_argument('-f', required=False, action="store_true",   help='force overwrite previous results')
        args = vars(parser.parse_args())
        detect.detect(args)

    elif sys.argv[1] == 'infer':
        from MetaCHIP2 import infer
        InferTree_parser = subparsers.add_parser('infer', description='infer tree', usage=infer.infer_usage)
        InferTree_parser.add_argument('-i', required=True,                       help='genome folder')
        InferTree_parser.add_argument('-x', required=False, default='fna',       help='genome file extension, default: fna')
        InferTree_parser.add_argument('-o', required=True,                       help='output folder')
        InferTree_parser.add_argument('-t', required=False, type=int, default=1, help='number of threads')
        InferTree_parser.add_argument('-f', required=False, action="store_true", help='force overwrite existing results')
        args = vars(parser.parse_args())
        infer.infer(args)

    elif sys.argv[1] == 'root':
        from MetaCHIP2 import RootTree
        RootTree_parser = subparsers.add_parser('root', description='root tree', usage=RootTree.RootTree_usage)
        RootTree_parser.add_argument('-db',  required=True,                  help='GTDB database files')
        RootTree_parser.add_argument('-cb',  required=False, default=None,   help='GTDB classifications for bacterial genomes')
        RootTree_parser.add_argument('-ca',  required=False, default=None,   help='GTDB classifications for archaeal genomes')
        RootTree_parser.add_argument('-tb',  required=False, default=None,   help='GTDB-Tk inferred bacterial tree')
        RootTree_parser.add_argument('-ta',  required=False, default=None,   help='GTDB-Tk inferred archaeal tree')
        RootTree_parser.add_argument('-out', required=False, default=None,   help='rooted output tree')
        args = vars(parser.parse_args())
        RootTree.RootTree(args)

    else:
        print('Unrecognized command: %s, program exited' % sys.argv[1])
        exit()


'''
cd /Users/songweizhi/PycharmProjects/MetaCHIP2
rm -r build dist BioSAK.egg-info
python setup.py sdist bdist_wheel
twine upload dist/*

songweizhi
shan88

pip install --upgrade MetaCHIP2

'''


to_do = '''

# twine upload --repository-url https://test.pypi.org/legacy/ dist/*
# pip3 install --upgrade -i https://test.pypi.org/simple/ MetaCHIP2

1. if no PG validated HGTs, skip plot, but not report error
2. !!!!!!!!!! get file list by RE is very slow (put files to delete into a tmp folder, then delete the folder)

'''
