from __future__ import print_function
import sys
import struct
import os

#dummy class for stuffing the file headers into
class FileEntry:
	pass

#arguments are source directory, then target filename e.g. "pak1.pak"
rootdir = sys.argv[1]
pakfilename = sys.argv[2]

pakfile = open(pakfilename,"wb")

#write a dummy header to start with
pakfile.write(struct.Struct("<4s2l").pack(b"PACK",0,0))

#walk the directory recursively, add the files and record the file entries
offset = 12
fileentries = []
for root, subFolders, files in os.walk(rootdir):
	for file in files:
		entry = FileEntry()
		impfilename = os.path.join(root,file)
		entry.filename = os.path.relpath(impfilename,rootdir).replace("\\","/")
		if(entry.filename.startswith(".")):continue
		print("pak: "+entry.filename)
		with open(impfilename, "rb") as importfile:
			pakfile.write(importfile.read())
			entry.offset = offset
			entry.length = importfile.tell()
			offset = offset + entry.length
		fileentries.append(entry)
tablesize = 0

#after all the file data, write the list of entries
for entry in fileentries:
	pakfile.write(struct.Struct("<56s").pack(entry.filename.encode("ascii")))
	pakfile.write(struct.Struct("<l").pack(entry.offset))
	pakfile.write(struct.Struct("<l").pack(entry.length))
	tablesize = tablesize + 64

#return to the header and write the values correctly
pakfile.seek(0)
pakfile.write(struct.Struct("<4s2l").pack(b"PACK",offset,tablesize))