#!/usr/bin/env python3

import argparse
import re

version='1.1.0'

parser = argparse.ArgumentParser(description="%s v%s: Exports a tab delimited file from a long output produced by 'testThorough'." % ('%(prog)s', version), add_help=False)

# Add the arguments to the parser
requirArgs = parser.add_argument_group('Required arguments')
outputArgs = parser.add_argument_group('Optional arguments related to the output')
optionArgs = parser.add_argument_group('Other optional arguments')

requirArgs.add_argument("-f", "--file", dest="file_in", required=True,
						help="A detailed file produced by 'testThorough'.")

outputArgs.add_argument("-o", "--output", dest="file_out", required=False, default=None,
						help="The name of the output file. By default will replace the extension by '_table.tsv'.")

optionArgs.add_argument("-v", "--verbose", dest="verbose", required=False, action="store_false",
						help="If selected, will not print information to the console.")

optionArgs.add_argument("-h", "--help", action="help",
						help="Show this help message and exit.")

optionArgs.add_argument("-V", "--version", action='version',
						version='oligoN-design %s v%s' % ('%(prog)s', version),
						help='Show the version number and exit.')

args = parser.parse_args()

# Setting variables ________________________________________________________________________________
if args.file_out is None:
	output = re.sub("\\.[^\\.]+$", "_table.tsv", args.file_in)
else:
	output = args.file_out

# Reading input files ______________________________________________________________________________
if args.verbose:
	print("  Exporting table to:", output)
with open(output, "w", buffering=1) as outfile:
	i = 0
	header = True
	dimers = None
	hairpins = None
	consecutives = None
	mismatches = None
	flank = False
	center = False
	for line in open(args.file_in):
	# for line in open("pr2_radB_test_tested_subset_testThrough.tsv"):
		i += 1
		if header:
			if "Tested file" in line:
				if args.verbose:
					print(line, end="")
			if "Excluding file" in line:
				if args.verbose:
					print(line, end="")
			if "Self-dimerization" in line:
				dimers = "\tself-dimer_count"
			if "Hairpins" in line:
				hairpins = "\thairpin_count"
			if "Identical consecutive bases" in line:
				consecutives = "\tmax_consecutive"
			if "  Mismatches:\t" in line:
				tmp = line.strip().split("\t")[1]
				tmp = tmp.strip().split()
				mismatches = ""
			if "Leading or trailing bases:\t" in line:
				basesF = line.strip().split("\t")[1]
				basesF = basesF.strip().split()[0]
				if "%" in basesF:
					basesF = re.sub("%", "", basesF)
					basesF = float(basesF)/100
				flank = True
			if "Central bases:\t" in line:
				basesC = line.strip().split("\t")[1]
				basesC = basesC.strip().split()[0]
				if "%" in basesC:
					basesC = re.sub("%", "", basesC)
					basesC = float(basesC)/100
				center = True
			if "----------------------------------------" in line:
				if mismatches == "":
					for j in tmp:
						mismatches = mismatches + "\tmismatch" + str(j) + "_thorough_prop"
						mismatches = mismatches + "\tmismatch" + str(j) + "_thorough"
						if flank:
							mismatches = mismatches + "\tmismatch" + str(j) + "_flanks"  + str(basesF)
						if center:
							mismatches = mismatches + "\tmismatch" + str(j) + "_central"  + str(basesC)
				header = False
				lineout = "identifier\tsequence" + dimers + hairpins + consecutives + mismatches
				print(lineout, file=outfile, flush=True)
				mismatches = ""
		else:
			if "Oligo:" in line:
				oligo = line.strip().split()[1]
			if "Sequence:" in line:
				sequence = line.strip().split()[1]
			if "Total sef-dimers with at least" in line:
				dimers = line.strip().split("\t")[1]
			if "Total hairpins with at least" in line:
				hairpins = line.strip().split("\t")[1]
			if "Maximum consecutive bases" in line:
				consecutives = line.strip().split("\t")[1]
			if "Total number of hits allowing" in line or "Total unique hits allowing" in line:
				line = line.strip().split("\t")
				tmp = re.sub("%", "", line[2])
				tmp = round(float(tmp) / 100, 4)
				mismatches = mismatches + "\t" +  str(tmp) + "\t" + line[1]
				tmp = line[1]
				if (tmp == '0') & flank:
					mismatches = mismatches + "\t0"
				if (tmp == '0') & center:
					mismatches = mismatches + "\t0"
			if "leading or trailing positions" in line:
				line = line.strip().split("\t")
				mismatches = mismatches + "\t" + line[1]
			if "central positions" in line:
				line = line.strip().split("\t")
				mismatches = mismatches + "\t" + line[1]
			if "--------------------" in line:
				lineout = oligo + "\t" + sequence + "\t" + dimers + "\t" + hairpins + "\t" + consecutives + mismatches
				print(lineout, file=outfile, flush=True)
				mismatches = ""

if args.verbose:
	print("Done")
