#! /usr/bin/python
##2017 Nov 7
##Written by: Peter Schafran

##Converts GFF3 annotation file from Geneious to GenBank 5-column annotation file
##WARNINGS: Assumes all annotations uniquely named -- will join annotations with the same name
##          Requires user to manually input name, truncated sequence markers
## 8 Nov 2017 -- modified to write individual filenames and table headers as GenBank accessions; creates single merged file at end

import sys, re

filelist=sys.argv[1:]
newfilelist = []
for file in filelist:
	gff_file = file
	outputfilename=gff_file.split('.')
	infile = open(gff_file, 'r')

	#Create output tbl file and write first header line
	outfile = open("%s.%s.tbl" %(outputfilename[0],outputfilename[1]), 'w')
	newfilelist.append("%s.%s.tbl" %(outputfilename[0],outputfilename[1]))
	outfile.write(">Feature gb\t%s.%s\t%s.%s\n" %(outputfilename[0],outputfilename[1],outputfilename[0],outputfilename[1]))

	line_count=1
	gff_dict={}
	feature_dict={}
	#Parse input GFF3 file. Splits on tabs and enters this into gff_dict
	for line in infile:
		splitline=line.strip('\n').split('\t')
		gff_dict[line_count]=splitline
		#This if line skips the header in GFF3 files
		if line_count >=3:
			try:
				#print "Processing line %d - %s" %(line_count, line)
				#Breaks up items in descriptor column of GFF3 file
				splitline_2 = gff_dict[line_count][8].split(";")
				gff_dict[line_count][8]=splitline_2
				feature_dict[line_count]={}
				for item in gff_dict[line_count][8]:
					#print item
					splititem=item.strip('\n').split('=')
					feature_dict[line_count][splititem[0]]=splititem[1]
				
				#write elements from dictionaries to output tbl file
				#First two if lines determine if annotation is for forward or reverse strand and switches start/end location for reverse. Writes line with start/end points and NCBI feature class
				#print gff_dict[line_count]
				#print feature_dict[line_count]
	#			if gff_dict[line_count][6] == "+":
	#				outfile.write("%s\t%s\t%s\n" %(gff_dict[line_count][3],gff_dict[line_count][4],gff_dict[line_count][2]))
	#			if gff_dict[line_count][6] == "-":
	#				outfile.write("%s\t%s\t%s\n" %(gff_dict[line_count][4],gff_dict[line_count][3],gff_dict[line_count][2]))
	#			if "gene" in feature_dict[line_count].keys():
	#				outfile.write("\t\t\tgene\t%s\n" %(feature_dict[line_count]["gene"]))
	#			if "product" in feature_dict[line_count].keys():
	#				outfile.write("\t\t\tproduct\t%s\n" %(feature_dict[line_count]["product"]))
	#			if "note" in feature_dict[line_count].keys():
	#				outfile.write("\t\t\tnote\t%s\n" %(feature_dict[line_count]["note"]))
	#			if "protein_id" in feature_dict[line_count].keys():
	#				outfile.write("\t\t\tprotein_id\t%s\n" %(feature_dict[line_count]["protein_id"]))
	#			if "codon_start" in feature_dict[line_count].keys():
	#				outfile.write("\t\t\tcodon_start\t%s\n" %(feature_dict[line_count]["codon_start"]))
	#			if "exception" in feature_dict[line_count].keys():
	#				outfile.write("\t\t\texception\t%s\n" %(feature_dict[line_count]["exception"]))
	#			if "Name" in feature_dict[line_count].keys():
	#				outfile.write("\t\t\tname\t%s\n" %(feature_dict[line_count]["Name"]))
			except:
				#print "Cannot process line #%d - %s" %(line_count, line)
				pass
		line_count+=1
	#print feature_dict
	#print "%s\n" %(gff_dict)

	features = []
	for key in feature_dict.keys():
		try:
			features.append(feature_dict[key]["Name"])
		except:
			pass

	unique_features = list(set(features))

	for feature in unique_features:
		firstline = 1
		for line in feature_dict:
			try:
				if feature in feature_dict[line]["Name"]:
					line_pass = line
					if firstline == 1:
						#print gff_dict[line][6], gff_dict[line][3], gff_dict[line][4], gff_dict[line][2]
						if gff_dict[line][6] == "+":
							outfile.write("%s\t%s\t%s\n" %(gff_dict[line][3], gff_dict[line][4], gff_dict[line][2]))
						if gff_dict[line][6] == "-":
							outfile.write("%s\t%s\t%s\n" %(gff_dict[line][4], gff_dict[line][3], gff_dict[line][2]))
						firstline = 0
					elif firstline == 0:
						#print gff_dict[line][3], gff_dict[line][4]
						if gff_dict[line][6] == "+":
							outfile.write("%s\t%s\n" %(gff_dict[line][3], gff_dict[line][4]))
						if gff_dict[line][6] == "-":
							outfile.write("%s\t%s\n" %(gff_dict[line][4], gff_dict[line][3]))
			except:
				pass
		try:
			outfile.write("\t\t\tgene\t%s\n" %(feature_dict[line_pass]["gene"]))
		except:
			pass
		try:
			outfile.write("\t\t\tproduct\t%s\n" %(feature_dict[line_pass]["product"]))
		except:
			pass
		try:
			outfile.write("\t\t\tnote\t%s\n" %(feature_dict[line_pass]["note"]))
		except:
			pass
		try:
			outfile.write("\t\t\texception\t%s\n" %(feature_dict[line_pass]["exception"]))
		except:
			pass
		try:
			outfile.write("\t\t\tcodon_start\t%s\n" %(feature_dict[line_pass]["codon_start"]))
		except:
			pass
		try:
			outfile.write("\t\t\tprotein_id\t%s\n" %(feature_dict[line_pass]["protein_id"]))
		except:
			pass
	

	outfile.close()

##Merge all single output files into one
mergedoutput = open("MergedOutput.tbl", "w")
for newfile in newfilelist:
	newopenfile = open(newfile, "r")
	for newline in newopenfile:
		mergedoutput.write(newline)
	newopenfile.close()
mergedoutput.close()

