
import sys
import io
import argparse
import time
from open_rfork import open_rfork
import traceback

from base import rObject

# from base import *
# from window import *
# from control import *
# from menu import *
# from sound import *
# from rect import rect, point, size


def rez_scope():
	# import all the resource types and constants into
	# a dictionary to be the exec() local scope
	import base
	import window
	import control
	import menu
	import sound
	import rect
	import version
	import tool_startup
	import icon
	import constants

	# could do: mod = importlib.import_module("base"), etc.
	scope = {}
	for mod in (base, window, control, menu, sound, rect, version, tool_startup, icon, constants):
		if hasattr(mod, '__all__'): keys = mod.__all__
		else: keys = [x for x in dir(mod) if x[0] != '_']

		for key in keys:
			scope[key] = getattr(mod, key)

	return scope

		

def execute(filename, scope):
	try:
		with open(filename, 'r', encoding="utf-8") as f:
			src = f.read()
			code = compile(src, filename, "exec")
			exec(code, {}, scope)
			return True
		pass
	except Exception as e:
		print(e)
		print(traceback.format_exc())
		return False

if __name__ == '__main__':
	p = argparse.ArgumentParser(prog='prez')
	p.add_argument('files', metavar='file', type=str, nargs='+')
	p.add_argument('--rez', action='store_true', help="Generate REZ code")
	p.add_argument('-x', action="store_true", help="Generate REZ data")

	p.add_argument('-D', type=str, nargs='+', help='define a variable')
	p.add_argument('--df', action="store_true", help="Write to a regular file")
	p.add_argument('-o', metavar='file', type=str, help="Specify output file")

	opts = p.parse_args()


	df = opts.df or not sys.platform in ("win32", "darwin")


	scope = rez_scope()
	errors = 0
	for f in opts.files:
		ok = execute(f, scope)
		if not ok: errors += 1

	if errors > 0 : sys.exit(1)

	if not opts.o: opts.rez = True
	if opts.x: opts.rez = True

	if df or opts.rez:
		open_rfork = io.open

	if opts.rez:
		print("/* Generated on {} */".format(time.ctime()))
		print('#include "types.rez"\n')
		if opts.x: rObject.dump_hex()
		else: rObject.dump_rez()
	else:
		with open_rfork(opts.o, "wb") as io:
			rObject.save_resources(io)

	rObject.dump_exports()
	sys.exit(0)
