#!python
import texthon
import io
import string
import argparse

description = "Evaluates a template using the Texthon template engine"
epilog = """Examples:

texthon hello.tmpl.txt -P who=someone -P count=5
texthon main.tmpl.txt -P -I lib1 -I lib2 -o output.txt
"""

parser = argparse.ArgumentParser(
	formatter_class = argparse.RawDescriptionHelpFormatter,
	description = description,
	epilog = epilog
)
parser.add_argument('template', help='the template to evaluate')
parser.add_argument('-I', '--include', action='append', default=[], help='include paths to resolve loads')
parser.add_argument('-P', '--param', action='append', default=[],
	help='parameter defines (KEY=VALUE). VALUE is automatically interpreted as a string or an integer')

parser.add_argument('-pf', '--paramfile', default=None, help='parameter definition file')
parser.add_argument('-v', '--verbose', action='store_true', default=False)
parser.add_argument('-d', '--dump', action='store_true', default=False, help='dump the generated python code')
parser.add_argument('-o', '--out', default=None, help='the output file')
args = parser.parse_args()

engine = texthon.Engine()
engine.add_includes(args.include)
engine.set_verbose(args.verbose)
module = engine.load_file(args.template)

if args.dump:
	for out in engine.modules.values():
		out.dump()

path = module.path

# compile and run
engine.make()

params = {}

if args.paramfile:
	params = eval(open(args.paramfile).read())

for param in args.param:
	k, v = param.split('=')
	if v.isdigit():
		v = int(v)
	params[k] = v

module = engine.modules[path]
output = module.main(**params)

if args.out:
	open(args.out, "w").write(output)
else:
	print(output)

