#!/usr/bin/env python3

import argparse
import os
import sys

import yaml
from mako.template import Template


def generate_cpp(inventory_yaml, output_dir):
    with open(inventory_yaml, "r") as f:
        ifile = yaml.safe_load(f)
        if not isinstance(ifile, dict):
            ifile = {}

        # Render the mako template

        t = Template(filename=os.path.join(script_dir, "readfru.mako.cpp"))

        output_hpp = os.path.join(output_dir, "fru-read-gen.cpp")
        with open(output_hpp, "w") as fd:
            fd.write(t.render(fruDict=ifile))


def main():
    valid_commands = {"generate-cpp": generate_cpp}
    parser = argparse.ArgumentParser(description="IPMI FRU map code generator")

    parser.add_argument(
        "-i",
        "--inventory_yaml",
        dest="inventory_yaml",
        default="example.yaml",
        help="input inventory yaml file to parse",
    )

    parser.add_argument(
        "-o",
        "--output-dir",
        dest="outputdir",
        default=".",
        help="output directory",
    )

    parser.add_argument(
        "command",
        metavar="COMMAND",
        type=str,
        choices=valid_commands.keys(),
        help="Command to run.",
    )

    args = parser.parse_args()

    if not (os.path.isfile(args.inventory_yaml)):
        sys.exit("Can not find input yaml file " + args.inventory_yaml)

    function = valid_commands[args.command]
    function(args.inventory_yaml, args.outputdir)


if __name__ == "__main__":
    script_dir = os.path.dirname(os.path.realpath(__file__))
    main()
