#!/bin/env python3.6

import os, sys, json

from argparse import ArgumentParser


def main():
    parser = ArgumentParser(description='Python template expander.  \
    Make a template with a format string syntax and environment vars, arguments and config file vars are expanded.')

    parser.add_argument('input', nargs='?',
                        help='Input file')

    parser.add_argument('--var', action='append', default=[],
                        help='Variable key[=value] pair')

    parser.add_argument('--conf', action='append', default=[],
                        help='Json file with vars in it')

    args = parser.parse_args()

    var = os.environ.copy()

    for e in args.var:
        if '=' in e:
            (k, v) = e.split('=')
        else:
            (k, v) = e, "1"
        var[k] = v

    for f in args.conf:
        var.update(json.load(open(f)))

    # replace dash with underscore because python vars can't have dashes, but vars can
    var = {k.replace("-", "_"): v for k, v in var.items()}

    if args.input is None:
        inf = sys.stdin
    else:
        inf = open(args.input)

    ind = inf.read()

    ind.replace('\\', '\\\\')
    ind.replace('"""', '\\"\\"\\"')

    ind = 'f"""' + ind + '"""'

    def ifdef(and_vars, if_val, else_val=""):
        if isinstance(and_vars, str):
            and_vars = [and_vars]

        for v in and_vars:
            if v not in var:
                return else_val

        return if_val

    var["ifdef"] = ifdef

    ind = eval(ind, {}, var)
    print(ind)


if __name__ == "__main__":
    main()