#!python

import sys
import argparse
import subprocess
import os.path
from pkg_resources import resource_stream
import deviaTE.deviaTE_IO as IO


parser = argparse.ArgumentParser()
parser.add_argument('--input', required=True)
parser.add_argument('--library')
parser.add_argument('--qual_threshold', default='15')
parser.add_argument('--min_read_length', default='1')
parser.add_argument('--min_alignment_length', default='1')
parser.add_argument('--threads', default='1')
parser.add_argument('--quality_encoding', default='phred+33', choices=['phred+64', 'phred+33'])
parser.add_argument('--nofuse', action='store_true', help='dev switch')
args = parser.parse_args()

# set resource file names and tmp files
if args.library is None:
    args.library = IO.get_data('lib/te_library')


trimmed = args.input + '.trim.tmp'
mapped = args.input + '.sam.tmp'
filtered = args.input + '.filt.tmp'
fused = args.input + '.fused'

print('Starting preparation: ' + args.input)

# check for index of library
index = os.path.isfile(args.library + '.bwt')
if index is False:
    raise ValueError('No index found for: ' + str(args.library) + '  Please use bwa index ' + str(args.library))

print('Trimming reads: ' + args.input)
# trimming
if args.quality_encoding == 'phred+33':
    qual = 'sanger'
elif args.quality_encoding == 'phred+64':
    qual = 'illumina'

trimming = ['deviaTE_trim.pl', '--input1', args.input, '--output', trimmed,
            '--quality-threshold', args.qual_threshold, '--min-length', args.min_read_length,
            '--fastq-type', qual]

IO.execute(command=' '.join(trimming))

print('Mapping reads: ' + args.input)
# mapping
mapping = ['bwa', 'bwasw', '-M', '-t', args.threads, args.library, trimmed]
IO.map_bwa(command=' '.join(mapping), outfile=mapped)

# filtering
if args.min_alignment_length != '1':
    IO.filter_alignment_length(inp=mapped, outp=filtered, lim=args.min_alignment_length)
else:
    mv = ['cp', mapped, filtered]
    IO.execute(command=' '.join(mv))

# fusing
if args.nofuse == False:
    fusing = ['deviaTE_fuse', '--input', filtered]
    IO.execute(command=' '.join(fusing))
    r1 = ['mv', filtered + '.fused.sort.bam', args.input + '.fused.sort.bam']
    r2 = ['mv', filtered + '.fused.sort.bam.bai', args.input + '.fused.sort.bam.bai']
    IO.execute(command=' '.join(r1))
    IO.execute(command=' '.join(r2))
else:
    fusing = ['mv', filtered, fused]
    IO.execute(command=' '.join(fusing))

    bam = ['samtools', 'view', '-b', fused, '-o', fused + '.bam']
    sort = ['samtools', 'sort', fused + '.bam', '-o', fused + '.sort.bam']
    index = ['samtools', 'index', fused + '.sort.bam', fused + '.sort.bam.bai']
    subprocess.run(' '.join(bam), shell=True)
    subprocess.run(' '.join(sort), shell=True)
    subprocess.run(' '.join(index), shell=True)


# clean-up
cleaning = ['rm', trimmed, filtered, mapped, trimmed + '.params']
IO.execute(command=' '.join(cleaning))

print('finished preparation')


