#!/usr/bin/env python3

import re
import os
import os.path
import subprocess
import sys

#Version  May 24, 2023
# Run D3HOM, D4HOM as a command
#Synopsis: dxhom.py ifn strand outfile startx finishx starty\
#            finishy range minper compfact kind linesize program

#Convert arguments to variables
IFN = sys.argv[1]
STRAND   = sys.argv[2]
OUTFILE  = sys.argv[3]
STARTX   = int(sys.argv[4])
FINISHX  = int(sys.argv[5])
STARTY   = int(sys.argv[6])
FINISHY  = int(sys.argv[7])
RANGE    = int(sys.argv[8])
MINPER   = int(sys.argv[9])
COMPFACT = int(sys.argv[10])
KIND     = sys.argv[11]
LINESIZE = int(sys.argv[12])
PROGRAM  = sys.argv[13]


PID = str(os.getpid()) #process id
NL = "\n"

# Write the next GenBank Entry from INFILE to OUTFILE, and return the length
# of the sequence.
def MakeGBFile(infile,OUTFN) :
    LEN = 0
    outfile = open(OUTFN,"w")
    NEXTLINE = infile.readline()
    TOKENS = NEXTLINE.split()
    if TOKENS[0] == "LOCUS" :
        LEN = int(TOKENS[2])
        outfile.write(NEXTLINE)
        while not NEXTLINE.startswith("/") :
            NEXTLINE = infile.readline()
            outfile.write(NEXTLINE)
    outfile.close()
    return LEN

SEQFILEX = IFN + '.X.' + PID
SEQFILEY = IFN + '.Y.' + PID
OKAY = True
infile = open(IFN,'r')
# We only create files for the first two GenBank entries in infile,
# and ignore the rest, if any.
SEQLENGTHX = MakeGBFile(infile,SEQFILEX)
SEQLENGTHY = MakeGBFile(infile,SEQFILEY)
infile.close()

# Sanity checking

if STARTX > SEQLENGTHX:
    STARTX = SEQLENGTHX
if FINISHX > SEQLENGTHX:
    FINISHX = SEQLENGTHX

if STARTY > SEQLENGTHY:
    STARTY = SEQLENGTHY
if FINISHY > SEQLENGTHY:
    FINISHY = SEQLENGTHY
   
# Abort if parameters aren't set up properly.
# Right now we don't do any checking, but we have this
# step for any future checking.
if not OKAY:
    print('>>> Aborting program.')
    exit()
else:       
    # ------------------- Generate a file of commands to be read by D3HOM or D4HOM ----------
    COMFN = 'dxhom.py' + '.COM.' + PID
    comfile = open(COMFN, 'w')

    # Open files
    comfile.write(SEQFILEX + NL)
    comfile.write('g' + NL)
    comfile.write(STRAND + NL)
    comfile.write(SEQFILEY + NL)
    comfile.write('g' + NL)
    comfile.write(OUTFILE + NL) 

    # Set parameters
    comfile.write('4\n')     #Choose parameter menu

    comfile.write('1\n')     #choose startx
    comfile.write(str(STARTX) + NL)

    comfile.write('2\n')      #choose finishx
    comfile.write(str(FINISHX) + NL)

    comfile.write('3\n')      #choose startx
    comfile.write(str(STARTY) + NL)

    comfile.write('4\n')      #choose finishx
    comfile.write(str(FINISHY) + NL)

    comfile.write('5\n')      #choose range
    comfile.write(str(RANGE) + NL)

    comfile.write('7\n')      #choose minper
    comfile.write(str(MINPER) + NL)

    comfile.write('8\n')      #choose compfact
    comfile.write(str(COMPFACT) + NL)

    comfile.write('9\n')      #choose kind
    comfile.write(KIND + NL)

    comfile.write('10\n')     #choose linesize
    comfile.write(str(LINESIZE) + NL)

    comfile.write('0\n')       #exit parameter menu

    comfile.write('6\n')       #write output to file

    comfile.write('0\n')       #exit program
    comfile.close()
    
    # run d3hom or d4hom and then clean up temporary files (no temporary files in python version)
    comfile = open(COMFN, 'r')
    p = subprocess.Popen([PROGRAM], stdin=comfile)
    p.wait()
    comfile.close()
    os.remove(COMFN)
    os.remove(SEQFILEX)
    os.remove(SEQFILEY)