#!/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
    uclust_16s       ->  cluster marker genes with Usearch
    barrnap_16s      ->  identify 16S gene sequences with Barrnap
    subsample_reads  ->  subsample reads 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_16s
        link_16s_parser = subparsers.add_parser('link', description='Link MAGs with marker genes', usage=link_16s.link_Marker_MAG_usage)
        link_16s_parser.add_argument('-p',               required=True,                                     help='output prefix')
        link_16s_parser.add_argument('-r1',              required=True,                                     help='paired reads r1')
        link_16s_parser.add_argument('-r2',              required=True,                                     help='paired reads r2')
        link_16s_parser.add_argument('-r16s',            required=False,                                    help='16S reads')
        link_16s_parser.add_argument('-marker',          required=True,                                     help='marker gene sequences')
        link_16s_parser.add_argument('-g',               required=False,                default=None,       help='genomic sequences')
        link_16s_parser.add_argument('-mag',             required=False,                default=None,       help='metagenome-assembled-genome (MAG) folder')
        link_16s_parser.add_argument('-x',               required=False,                default='fasta',    help='MAG file extension, default: fasta')
        link_16s_parser.add_argument('-depth',           required=False, type=float,    default=0,          help='minimum depth multiple between 16S and  genomic sequences, a value of no higher than 0.2 is recommended, default: 0')
        link_16s_parser.add_argument('-s1_cigarM',       required=False, type=int,      default=30,         help='cigarM cutoff, default: 30')
        link_16s_parser.add_argument('-s1_cigarS',       required=False, type=int,      default=30,         help='cigarS cutoff, default: 30')
        link_16s_parser.add_argument('-s1_ri',           required=False, type=float,    default=100,        help='identity cutoff, default: 100')
        link_16s_parser.add_argument('-s1_rc',           required=False, type=float,    default=100,        help='coverage cutoff, default: 100')
        link_16s_parser.add_argument('-s1_mi',           required=False, type=float,    default=99.5,       help='within genome 16S identity cutoff, default: 99.5')
        link_16s_parser.add_argument('-s1_mc',           required=False, type=float,    default=90,         help='alignment coverage cutoff for calculating 16S identity, default: 90')
        link_16s_parser.add_argument('-s1_ma',           required=False, type=int,      default=500,        help='alignment length cutoff for calculating 16S identity, default: 500')
        link_16s_parser.add_argument('-s1_mpl',          required=False, type=int,      default=10,         help='minimum number of paired reads provided linkages to report, default: 10')
        link_16s_parser.add_argument('-s2_e',            required=False, type=int,      default=3000,       help='end length for mapping, default: 3000')
        link_16s_parser.add_argument('-s2_m',            required=False, type=int,      default=50,         help='minCigarM, default: 50')
        link_16s_parser.add_argument('-s2_g',            required=False, type=int,      default=300,        help='max_gap_to_end, default: 300')
        link_16s_parser.add_argument('-s2_r',            required=False, type=int,      default=3,          help='min_read_num, default: 3')
        link_16s_parser.add_argument('-t',               required=False, type=int,      default=1,          help='number of threads, default: 1')
        link_16s_parser.add_argument('-quiet',           required=False, action="store_true",               help='not report progress')
        link_16s_parser.add_argument('-force',           required=False, action="store_true",               help='force overwrite existing results')
        link_16s_parser.add_argument('-tmp',             required=False, action="store_true",               help='keep temporary files')
        link_16s_parser.add_argument('-test_mode',       required=False, action="store_true",               help='only for debugging, do not provide')
        link_16s_parser.add_argument('-bbmap',           required=False, action="store_true",               help='run bbmap, instead of bowtie')
        args = vars(parser.parse_args())
        link_16s.link_16s(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('-r1',             required=False, default=None,                                      help='forward reads')
        matam_16s_parser.add_argument('-r2',             required=False, default=None,                                      help='reverse reads')
        matam_16s_parser.add_argument('-r16s',           required=False, default=None,                                      help='extracted 16S reads')
        matam_16s_parser.add_argument('-pct',            required=True, type=str, default='1,5,10,25,50,75,100',            help='subsample percentage, must be integer, between 1-100, deafault: 1,5,10,25,50,75,100')
        matam_16s_parser.add_argument('-d',              required=False, type=str,                                          help='MATAM ref db, same as "-d" in Matam')
        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, default='matam_assembly.py',             help='path to matam_assembly.py, default: matam_assembly.py')
        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)

    elif sys.argv[1] == 'subsample_reads':
        from MarkerMAG import subsample_reads
        subsample_reads_parser = subparsers.add_parser('subsample_reads', description='subsample paired reads', usage=subsample_reads.subsample_reads_usage)
        subsample_reads_parser.add_argument('-r1',      required=True, type=str,            help='forward reads')
        subsample_reads_parser.add_argument('-r2',      required=True, type=str,            help='reverse reads')
        subsample_reads_parser.add_argument('-ratio',   required=True, type=str,            help='subsample ratio, 0-1')
        subsample_reads_parser.add_argument('-usearch', required=False, default='usearch',  help='path to usearch executable file, default: usearch')

        args = vars(parser.parse_args())
        subsample_reads.subsample_reads(args)

    elif sys.argv[1] == 'barrnap_16s':
        from MarkerMAG import barrnap_16s
        barrnap_16s_parser = subparsers.add_parser('barrnap_16s', description='identify 16S sequences with Barrnap', usage=barrnap_16s.barrnap_16s_usage)
        barrnap_16s_parser.add_argument('-p',       required=True, type=str,               help='output prefix')
        barrnap_16s_parser.add_argument('-g',       required=True, type=str,               help='genome folder')
        barrnap_16s_parser.add_argument('-x',       required=False, default='fasta',       help='genome file extension, default: fasta')
        barrnap_16s_parser.add_argument('-t',       required=False, type=int, default=1,   help='number of threads, default: 1')
        barrnap_16s_parser.add_argument('-force',   required=False, action="store_true",   help='force overwrite existing results')
        args = vars(parser.parse_args())
        barrnap_16s.barrnap_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

shan88

pip3 install --upgrade MarkerMAG

'''
