
import os
import zipfile

global gameDir
gameDir = ""

gameAssets = {}
class Asset:
	path = ""
	vpath = ""
	paktype = 0

	def __init__(self, p, vp, ptype):
		self.path = p
		self.vpath = vp
		self.paktype = ptype

def addAsset(path, vpath, pt) -> Asset:
	if (gameAssets.get(vpath, 0) != 0):
		return
	
	new_asset = Asset(path, vpath, pt)
	gameAssets[vpath] = new_asset

	if (pt):
		print("QFS: adding asset \"" + vpath + "\" from package \"" + path + "\"")
	else:
		print("QFS: adding asset \"" + vpath + "\"")
	return new_asset


def loadDirectory(path, vpath):
	folderList = []
	#print("loadDirectory: " + vpath)

	for file in os.listdir(path):
		if (os.path.isfile(path + file)):
			addAsset(path + file, vpath + file, 0)
		elif (os.path.isdir(path)):
			folderList.append(file)

	for folder in folderList:
		loadDirectory(path + folder + "/", vpath + folder + "/")
	return


def loadPak(path, vpath):
	pak = zipfile.ZipFile(path, "r")


	for file in pak.infolist():
		if (file.is_dir()):
			continue
		new_asset = addAsset(path, file.filename, 1)
	return


def loadAssets():
	global gameDir
	archiveList = []

	for file in os.listdir(gameDir):
		if (os.path.isfile(gameDir + file)):
			if (file[-4:] == ".pk3" or file[-4:] == ".pkz"):
				archiveList.append(file)
				continue
			addAsset(file, file, 0)
		elif (os.path.isdir(gameDir + file)):
			if (file[-7:] == ".pk3dir"):
				archiveList.append(file)
	
	archiveList.sort(reverse=True)
	for pak in archiveList:
		if (os.path.isfile(gameDir + pak)):
			loadPak(gameDir + pak, "")
		else:
			loadDirectory(gameDir + pak + "/", "")

def containsGame(dir, gamename):
	print("checking directory... " + dir + gamename)
	if (os.path.exists(dir + gamename)):
		return True
	return False

def initQFS(gamename) -> bool:
	global gameDir
	dirCurrent = os.getcwd() + "/"
	if (containsGame(dirCurrent, gamename) == False):
		dirCurrent += "../"
		if (containsGame(dirCurrent, gamename) == False):
			dirCurrent += "../"
		else:
			return False
		
	dirCurrent += gamename + "/"
	print("initQFS: " + dirCurrent)
	gameDir = dirCurrent
	loadAssets()

	return True









