#!/usr/bin/env python3

import argparse
import sys
import os
import pkg_resources
sys.path.append('../')
sys.path.append('./')
from tiptoft.TipToft import TipToft
from tiptoft.InputTypes import InputTypes

version = ''
try:
	version = pkg_resources.get_distribution("tiptoft").version
except pkg_resources.DistributionNotFound:
	version = 'x.y.z'

parser = argparse.ArgumentParser(
	description = 'Plasmid replicon and incompatibility group prediction from uncorrected long reads',
	usage = 'tiptoft [options] input.fastq', formatter_class=argparse.ArgumentDefaultsHelpFormatter)

parser.add_argument('input_fastq', help='Input FASTQ file (optionally gzipped)', type=InputTypes.is_fastq_file_valid)

inputs = parser.add_argument_group('Optional input arguments')
inputs.add_argument('--plasmid_data', '-d', help='FASTA file containing plasmid data from downloader script, defaults to bundled database', type=InputTypes.is_plasmid_file_valid )
inputs.add_argument('--kmer',	 '-k', help='k-mer size', type=InputTypes.is_kmer_valid, default = 13)

outputs = parser.add_argument_group('Optional output arguments')
outputs.add_argument('--filtered_reads_file', '-f', help='Filename to save matching reads to')
outputs.add_argument('--output_file',	 '-o', help='Output file [STDOUT]')
outputs.add_argument('--print_interval',	 '-p', help='Print results every this number of reads', type=int)
outputs.add_argument('--verbose', '-v', action='store_true', help='Turn on debugging [%(default)s]', default = False)
outputs.add_argument('--version', action='version', version=str(version))

advanced = parser.add_argument_group('Optional advanced input arguments')
advanced.add_argument('--no_hc_compression', action='store_true', help='Turn off homoploymer compression of k-mers', default = False)
advanced.add_argument('--no_gene_filter', action='store_true', help='Dont filter out lower coverage genes from same group', default = False)
advanced.add_argument('--max_gap',  help='Maximum gap for blocks to be contigous, measured in multiples of the k-mer size', type=int, default=3)
advanced.add_argument('--max_kmer_count',  help='Exclude k-mers which occur more than this number of times in a sequence', type=int, default=10)
advanced.add_argument('--margin',  help='Flanking region around a block to use for mapping', type=int, default=10)
advanced.add_argument('--min_block_size',  help='Minimum block size in bases', type=int, default=50)
advanced.add_argument('--min_fasta_hits',	 '-m', help='Minimum No. of kmers matching a read', type=int, default = 8)
advanced.add_argument('--min_perc_coverage',	 '-c', help='Minimum percentage coverage of typing sequence to report', type=int, default = 85)
advanced.add_argument('--min_kmers_for_onex_pass', help='Minimum No. of kmers matching a read in 1st pass', type=int, default = 5)

options = parser.parse_args()

if options.verbose:
	
	import cProfile, pstats, io
	pr = cProfile.Profile()
	pr.enable()   

	tiptoft = TipToft(options)
	tiptoft.run()

	pr.disable()
	s = io.StringIO()
	sortby = 'cumulative'
	ps = pstats.Stats(pr, stream=s).sort_stats(sortby)
	ps.print_stats()
	print(s.getvalue())
	
else:
	tiptoft = TipToft(options)
	tiptoft.run()
