#!/bin/sh
''''[ ! -z $VIRTUAL_ENV ] && exec python -u -- "$0" ${1+"$@"}; command -v python3 > /dev/null && exec python3 -u -- "$0" ${1+"$@"}; exec python2 -u -- "$0" ${1+"$@"} # '''

import argparse
import os
import sys
import jinja2
from jinja2.meta import find_undeclared_variables
import re

READIES_PATH = os.path.realpath(os.path.join(os.path.dirname(__file__), ".."))
sys.path.insert(0, READIES_PATH)
import paella

parser = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter,
                                 description='Template text Jinja2-style formatter.\nUse {{VAR}} syntax to insert variables.')

parser.add_argument('-d', '--define', action='append', metavar=('VAR=value'), help='define variable')
parser.add_argument('-e', '--env', action='append', metavar=('VAR'), help='read variable from environment')
parser.add_argument('-f', '--file', action='append', metavar=('VARFILE'), help='read variables from file')
parser.add_argument('-s' ,'--strict', action="store_true", default=False, help='fail on undefined variables')
parser.add_argument('-u', '--skip-undef', action="store_true", default=False, help='skip undefined variables')
parser.add_argument('template', metavar='FILE', nargs='?', help='template file')
args = parser.parse_args()

vars = {}

def add_env_var(n):
    n = str.strip(n)
    v = os.environ.get(n)
    if not v is None:
        vars[n] = v

def add_var_exp(exp):
    m = re.match(r'^([^=\s]+)=(.*)', exp)
    if not m is None:
        n = m.group(1)
        v = m.group(2)
        vars[n] = v
    else:
        add_env_var(exp)

if not args.file is None:
    for f in args.file:
        with open(f, 'r') as file:
            for line in file.readlines():
                if line.startswith('#'):
                    continue
                add_var_exp(line)

if not args.define is None:
    for d in args.define:
        add_var_exp(d)

if not args.env is None:
    for n in args.env:
        add_env_var(n)

if args.template is None:
    t = sys.stdin.read()
else:
    with open(args.template, 'r') as file:
        t = file.read()

jenv = jinja2.Environment(undefined=jinja2.DebugUndefined)
jt = jenv.from_string(t)
jr = jt.render(vars)
if args.strict:
    ast = jenv.parse(jr)
    undefined = find_undeclared_variables(ast)
    if undefined:
        u = '\n'.join(undefined)
        eprint("error: the following vars are undefined:\n{u}".format(u=u))
        exit(1)

if not args.skip_undef:
    jr = jinja2.Template(t).render(vars)
print(jr)

exit(0)
