#!/usr/bin/env python3

from argparse import ArgumentParser
from struct import unpack
from decrypt import decrypt

import sys
import os.path

argparser = ArgumentParser('unpack GRP file')
argparser.add_argument('file')
args = argparser.parse_args()


f = open(args.file, "rb")

header = bytes(f.read(0x2c))
grp_dir = bytes(f.read(0x31))

id = decrypt(header[0:0x10])
if id != bytes('AGDS group file\x1a', 'ascii'):
	raise Exception('invalid header', id)

version1, magic, version2 = unpack('<III', header[0x10:0x1c])
if magic != 0x1a03c9e6 or version1 != 44 or version2 != 2:
	raise Exception("unsupported version")
dir_count, _dc2, _unk14, _unk18 = unpack('<IIII', header[0x1c:])

dir_data = bytearray(f.read(0x31 * dir_count))

gfx_name, _ = os.path.splitext(os.path.basename(args.file))
try:
	os.makedirs(gfx_name)
except:
	pass

for offset in range(0, dir_count * 0x31, 0x31):
	entry = dir_data[offset: offset + 0x31]
	name_len = entry.index(bytes([0]))
	if name_len == 0:
		break
	name = str(decrypt(entry[:name_len]), "utf-8")
	offset, size, _unk1, _unk2 = unpack('<IIII', entry[0x21:])
	f.seek(offset)

	print("writing file %s" %name)
	with open(os.path.join(gfx_name, name), "wb") as fo:
		fo.write(f.read(size))
