#!/usr/bin/env python3

import sys
import struct
import re

def print_usage():
    print("usage: convert_bin <bin2txt|txt2bin> <input_file> <output_file> <K>")

if len(sys.argv)!=5:
    print_usage()
    sys.exit(-1)

if sys.argv[1]=="bin2txt":
    direction="bin2txt"
elif sys.argv[1]=="txt2bin":
    direction="txt2bin"
else:
    print_usage()
    sys.exit(-1)

if direction=="txt2bin":
    inf=open(sys.argv[2],"r")
    out=open(sys.argv[3],"wb")
elif direction=="bin2txt":
    inf=open(sys.argv[2],"rb")
    out=open(sys.argv[3],"w")

K=int(sys.argv[4])

counter=0

if direction=="txt2bin":
    # read
    entries={}
    for line in inf.readlines():
        # remove double spaces
        line=re.sub('  *',' ',line)
        # remove initial spaces
        line=re.sub('^ ','',line)
        nums=line.split(" ")
        kx=int(nums[0])
        ky=int(nums[1])
        Re=float(nums[2])
        im=float(nums[3])
        entries[str(kx)+","+str(ky)]=[Re,im]
    # write
    for kx in range(0,K+1):
        for ky in range(-K,K+1):
            # ignore kx<0
            if (kx>0 or (kx==0 and ky>0)):
                # print if exists
                if str(kx)+","+str(ky) in entries:
                    out.write(struct.pack('dd',entries[str(kx)+","+str(ky)][0],entries[str(kx)+","+str(ky)][1]))
                else:
                    # otherwise 0
                    out.write(struct.pack('dd',0.,0.))


elif direction=="bin2txt":
    for kx in range(0,K+1):
        for ky in range(-K,K+1):
            # ignore kx<0
            if (kx>0 or (kx==0 and ky>0)) :
                entry=struct.unpack('dd',inf.read(16))
                print(kx,ky,entry[0],entry[1],file=out)

inf.close()
out.close()