#!/usr/bin/env python

import os
import yaml
import argparse
from mako.template import Template
import contextlib

if __name__ == '__main__':
    script_dir = os.path.dirname(os.path.realpath(__file__))
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "-f", "--filename",
        default='occ_sensor.yaml',
        help="Input File Name")
    parser.add_argument(
        "-i", "--input-dir",
        dest='inputdir',
        default=script_dir,
        help="Input directory")

    args = parser.parse_args()

    # Default to the one that is in the current.
    yaml_dir = script_dir
    yaml_file = os.path.join(yaml_dir, 'occ_sensor.yaml')

    if args.inputdir:
        yaml_dir = args.inputdir

    if args.filename:
        yaml_file = os.path.join(yaml_dir, args.filename)

    with open(yaml_file, 'r') as fd:
        ifile = yaml.safe_load(fd)

        # Render the mako template
        template = os.path.join(script_dir, 'occ_sensor.mako.hpp')
        t = Template(filename=template)
        with open('occ_sensor.hpp', 'w') as fd:
            fd.write(
                t.render(
                    occDict=ifile))
