#!/usr/bin/env python3

# Copyright (C) 2020, Weizhi Song, Torsten Thomas.
# songwz03@gmail.com or t.thomas@unsw.edu.au

# MarkerMAG 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.

# MarkerMAG 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 warnings
import argparse
from MarkerMAG.MarkerMAG_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 = ''' 
         ...::: MarkerMAG v%s :::...

    link             ->  link MAGs with marker genes
    rename_reads     ->  rename paired reads (in fasta format) 
    matam_16s        ->  including reads extraction, subsample, assembly and dereplication
    subsample_reads  ->  subsample reads with Usearch
    uclust_16s       ->  cluster marker genes with Usearch

    ''' % version(config_dict)

    print(help_message)


if __name__ == '__main__':

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

    # disable warning message
    warnings.filterwarnings('ignore')

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

    elif sys.argv[1] == 'link':
        from MarkerMAG import link_Marker_MAG
        link_Marker_MAG_parser = subparsers.add_parser('link', description='Link MAGs with marker genes', usage=link_Marker_MAG.link_Marker_MAG_usage)
        link_Marker_MAG_parser.add_argument('-p',               required=True,                              help='output prefix')
        link_Marker_MAG_parser.add_argument('-r1',              required=True,                              help='paired reads r1')
        link_Marker_MAG_parser.add_argument('-r2',              required=True,                              help='paired reads r2')
        link_Marker_MAG_parser.add_argument('-m',               required=True,                              help='marker gene sequences')
        link_Marker_MAG_parser.add_argument('-g',               required=False, default=None,               help='genomic sequences')
        link_Marker_MAG_parser.add_argument('-mag',             required=False, default=None,               help='metagenome-assembled-genome (MAG) folder')
        link_Marker_MAG_parser.add_argument('-x',               required=False, default='fasta',            help='MAG file extension, default: fasta')
        link_Marker_MAG_parser.add_argument('-mp',              required=False, type=str, default=0,        help='multiple placement during bowtie mapping, default: 0. choose from a,1,2,3...')
        link_Marker_MAG_parser.add_argument('-cigarM',          required=False, type=int, default=30,       help='cigarM cutoff, default: 30')
        link_Marker_MAG_parser.add_argument('-cigarS',          required=False, type=int, default=30,       help='cigarS cutoff, default: 30')
        link_Marker_MAG_parser.add_argument('-ri',              required=False, type=float, default=100,    help='identity cutoff, default: 100')
        link_Marker_MAG_parser.add_argument('-rc',              required=False, type=float, default=100,    help='coverage cutoff, default: 100')
        link_Marker_MAG_parser.add_argument('-mi',              required=False, type=float, default=99.5,   help='within genome 16S identity cutoff, default: 99.5')
        link_Marker_MAG_parser.add_argument('-mc',              required=False, type=float, default=90,     help='alignment coverage cutoff for calculating 16S identity, default: 90')
        link_Marker_MAG_parser.add_argument('-ma',              required=False, type=int, default=500,      help='alignment length cutoff for calculating 16S identity, default: 500')
        link_Marker_MAG_parser.add_argument('-mpl',             required=False, type=int, default=3,        help='minimum number of paired reads provided linkages to report, default: 3')
        link_Marker_MAG_parser.add_argument('-t',               required=False, type=int, default=1,        help='number of threads, default: 1')
        link_Marker_MAG_parser.add_argument('-quiet',           required=False, action="store_true",        help='not report progress')
        link_Marker_MAG_parser.add_argument('-force',           required=False, action="store_true",        help='force overwrite existing results')
        link_Marker_MAG_parser.add_argument('-tmp',             required=False, action="store_true",        help='keep temporary files')
        link_Marker_MAG_parser.add_argument('-test_mode',       required=False, action="store_true",        help='only for debugging, do not provide')
        link_Marker_MAG_parser.add_argument('-bbmap',           required=False, action="store_true",        help='run bbmap, instead of bowtie')
        link_Marker_MAG_parser.add_argument('-no_ambiguous',    required=False, action="store_true",        help='ignore ambiguous mappings, specify with dereplicated marker genes')
        args = vars(parser.parse_args())
        link_Marker_MAG.link_Marker_MAG(args, config_dict)

    elif sys.argv[1] == 'rename_reads':
        from MarkerMAG import rename_reads
        rename_reads_parser = subparsers.add_parser('rename_reads', description='Rename reads', usage=rename_reads.rename_reads_usage)
        rename_reads_parser.add_argument('-r1', required=True, type=str, help='forward reads, fasta format')
        rename_reads_parser.add_argument('-r2', required=True, type=str, help='reverse reads, fasta format')
        rename_reads_parser.add_argument('-p',  required=True, type=str, help='prefix of read id')
        args = vars(parser.parse_args())
        rename_reads.rename_reads(args)

    elif sys.argv[1] == 'matam_16s':
        from MarkerMAG import matam_16s
        matam_16s_parser = subparsers.add_parser('matam_16s', description='Assemble 16S rRNA genes with Matam', usage=matam_16s.matam_16s_usage)
        matam_16s_parser.add_argument('-p',                 required=True,                                       help='output prefix')
        matam_16s_parser.add_argument('-in',                required=True,                                       help='combined reads file')
        matam_16s_parser.add_argument('-pct',               required=True,  type=str, default='1,5,10,25,50,75', help='subsample percentage, deafault: 1,5,10,25,50,75')
        matam_16s_parser.add_argument('-ref',               required=False, type=str,                            help='Path to Matam reference database')
        matam_16s_parser.add_argument('-i',                 required=False, type=float, default=0.995,           help='cluster identity cutoff (0-1), default: 0.995')
        matam_16s_parser.add_argument('-t',                 required=False, type=int, default=1,                 help='number of threads, default: 1')
        matam_16s_parser.add_argument('-force',             required=False, action="store_true",                 help='force overwrite existing results')
        matam_16s_parser.add_argument('-quiet',             required=False, action="store_true",                 help='not report progress')
        matam_16s_parser.add_argument('-matam_assembly',    required=False, type=str,                            help='path to matam_assembly.py')
        matam_16s_parser.add_argument('-sortmerna',         required=False, type=str, default='sortmerna',       help='path to sortmerna executable file, default: sortmerna')
        matam_16s_parser.add_argument('-seqtk',             required=False, type=str, default='seqtk',           help='path to seqtk executable file, default: seqtk')
        matam_16s_parser.add_argument('-usearch',           required=False, type=str, default='usearch',         help='path to usearch executable file, default: usearch')
        args = vars(parser.parse_args())
        matam_16s.matam_16s(args)

    elif sys.argv[1] == 'uclust_16s':
        from MarkerMAG import uclust_16S
        uclust_16S_parser = subparsers.add_parser('uclust_16s', description='Cluster 16S with Usearch', usage=uclust_16S.uclust_16S_usage)
        uclust_16S_parser.add_argument('-in',           required=True,                          help='fasta file')
        uclust_16S_parser.add_argument('-i',            required=False, type=float, default=1,  help='Identity cutoff (0-1), default: 1')
        uclust_16S_parser.add_argument('-out',          required=True,                          help='file out')
        args = vars(parser.parse_args())
        uclust_16S.uclust_16S(args)

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


upload_to_pypi_cmd = '''

alias twine='/Users/songweizhi/Library/Python/3.7/bin/twine'
cd /Users/songweizhi/PycharmProjects/MarkerMAG
rm -r build
rm -r dist
rm -r MarkerMAG.egg-info
python setup.py sdist bdist_wheel
twine upload dist/*
songweizhi


alias twine='/Users/songweizhi/Library/Python/3.7/bin/twine'
cd /Users/songweizhi/PycharmProjects/MarkerMAG
rm -r build
rm -r dist
rm -r MarkerMAG.egg-info
python setup.py sdist bdist_wheel
twine upload --repository-url https://test.pypi.org/legacy/ dist/*
songweizhi


shan88


pip3 install --upgrade MarkerMAG
pip3 install --upgrade -i https://test.pypi.org/simple/ MarkerMAG

'''
