#!/usr/local/home/russel/mibi/Software/miniconda2/envs/cctyper2/bin/python

import argparse
import logging
import os
import sys
import pkg_resources

from srufinder.controller import Controller
from srufinder.prodigal import Prodigal
from srufinder.blast import Blast
from srufinder.cluster import Cluster

########## Arguments ##########
ap = argparse.ArgumentParser(description='SRUFinder version {}'.format(pkg_resources.require("srufinder")[0].version))

# Required
ap.add_argument('input', help='Input fasta file')
ap.add_argument('output', help='Prefix for output directory')

# Optional
ap.add_argument('-t', '--threads', help='Number of parallel processes [%(default)s].', default=4, type=int)
ap.add_argument('--prodigal', help='Which mode to run prodigal in [%(default)s].', default='single', type=str, choices=['single','meta'])
ap.add_argument('--log_lvl', help='Logging level [%(default)s].', default='INFO', type=str, choices=['DEBUG','INFO','WARNING','ERROR'])
ap.add_argument('--selfmatch', help='Do self-targeting analysis, i.e. BLAST spacers against the input', action='store_true')
ap.add_argument('--in_orf', help='Reverse the search to only search inside ORFs, as a means to distinguish false from true SRUs', action='store_true')

# Data
apd = ap.add_argument_group('data arguments')
apd.add_argument('--db', help='Path to database.', default='', type=str)

# Thresholds
apt = ap.add_argument_group('threshold arguments')
apt.add_argument('--orf', help='ORF confidence threshold [%(default)s].', default=80, type=int)
apt.add_argument('--word_size', help='Word size for BLASTN [%(default)s].', default=6, type=int)
apt.add_argument('--identity', help='Identity cutoff for considering BLAST matches [%(default)s].', default=90, type=float)
apt.add_argument('--coverage', help='Coverage cutoff for splitting matches in complete and partial [%(default)s].', default=90, type=float)
apt.add_argument('--score', help='BLAST score cutoff for discerning false from putative SRUs. This has been set empirically by comparing scores of intergenic (putative) SRUs and SRUs inside ORFs (false) [%(default)s].', default=41.1, type=float)
apt.add_argument('--coverage_part', help='Coverage cutoff for partial matches [%(default)s].', default=50, type=float)
apt.add_argument('--max_dist', help='Maximum distance between matches to be part of same array [%(default)s].', default=100, type=int)
apt.add_argument('--flank', help='bp to extract of the flanking regions [%(default)s].', default=100, type=int)
apt.add_argument('--spacer_identity', help='Identity cutoff for considering BLAST matches for spacers [%(default)s].', default=90, type=float)
apt.add_argument('--spacer_coverage', help='Coverage cutoff for considering BLAST matches for spacers [%(default)s].', default=90, type=float)


########## Workflow ##########
master = Controller(ap.parse_args())

proteins = Prodigal(master)
proteins.run()

blast = Blast(master)
blast.run()

cluster = Cluster(master)
cluster.run()

blast2 = Blast(master)
blast.run_spacer()

master.clean()
logging.info('Done')
