#!/usr/bin/env python3

import argparse

from fqutil import Fastq, encoding2num


def main():
    parser = argparse.ArgumentParser(
        description='Trim both ends of a FASTQ by phred score.'
        'Resulting reads shorter than a minimum length are discarded')
    parser.add_argument('input', default=None, nargs='?', type=str, 
        help='Input FASTQ (can be gzipped). '
        'If no argument is supplied, reads will be read from stdin.')
    parser.add_argument('-o', '--output', default=None, nargs=1, type=str, 
        help='Output file to write. Format is autodetected from file extension. '
        'If no argument is supplied, reads will be written to stdout.')
    parser.add_argument('-q', '--min-qual', default=30, nargs=1, type=int,
        help='Minimum phred score. Disabled by setting it to -10.')
    parser.add_argument('-m', '--min-length', default=30, nargs=1, type=int,
        help='Minimum read length after trimming.')
    parser.add_argument('-M', '--max-length', default=99999999, nargs=1, type=int,
        help='Minimum read length after trimming.')
    argv = parser.parse_args()

    fastq_in = Fastq(argv.input[0])
    fastq_out = Fastq(argv.output[0])
    min_qual = argv.min_qual
    min_len = argv.min_length
    max_len = argv.max_length
    
    # read file and print back lines that pass the filter
    while True:
        read = fastq_in.get_read()
        if read is None:
            break  # EOF
        qual = encoding2num(read[3], parser.encoding)
        
        # get indices of acceptable quality
        start = -1
        for q in qual:
            start += 1
            if q >= min_qual:
                break
        end = 0
        for q in reversed(qual):
            end -= 1
            if q >= min_qual:
                break
        if min_len <= len(qual) - start + end <= max_len:
            fastq_out.writelines([
                read[0], read[1][start:end] + '\n', 
                read[2], read[3][start:end] + '\n'])
    fastq_in.close()
    fastq_out.close()

if __name__ == '__main__':
    main()
