#!/usr/bin/env python3
import yaml
import os
import argparse
from inflection import underscore

if __name__ == "__main__":
    script_dir = os.path.dirname(os.path.realpath(__file__))
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "-f", "--filename", default="led.yaml", help="Input File Name"
    )
    parser.add_argument(
        "-i",
        "--input-dir",
        dest="inputdir",
        default=script_dir,
        help="Input directory",
    )
    parser.add_argument(
        "-o",
        "--output-dir",
        dest="outputdir",
        default=".",
        help="Output 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, "led.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 f:
        ifile = yaml.safe_load(f)

    # Dictionary having [Name:Priority]
    priority_dict = {}

    with open(os.path.join(args.outputdir, "led-gen.hpp"), "w") as ofile:
        ofile.write("/* !!! WARNING: This is a GENERATED Code..")
        ofile.write("Please do NOT Edit !!! */\n\n")

        ofile.write("static const std::unordered_map<std::string,")
        ofile.write(" std::set<phosphor::led::Layout::LedAction>>")
        ofile.write(" systemLedMap = {\n\n")
        for group in list(ifile.keys()):
            # This section generates an std::unordered_map of LedGroupNames to
            # std::set of LEDs containing the name and properties
            led_dict = ifile[group]
            ofile.write(
                '   {"'
                + "/xyz/openbmc_project/led/groups/"
                + underscore(group)
                + '",{\n'
            )

            # Some LED groups could be empty
            if not led_dict:
                ofile.write("   }},\n")
                continue

            for led_name, list_dict in list(led_dict.items()):
                value = list_dict.get("Priority")
                if led_name in priority_dict:
                    if value != priority_dict[led_name]:
                        # Priority for a particular LED needs to stay SAME
                        # across all groups
                        ofile.close()
                        os.remove(ofile.name)
                        raise ValueError(
                            "Priority for ["
                            + led_name
                            + "] is NOT same across all groups"
                        )
                else:
                    priority_dict[led_name] = value

                ofile.write('        {"' + underscore(led_name) + '",')
                ofile.write(
                    "phosphor::led::Layout::Action::"
                    + str(list_dict.get("Action", "Off"))
                    + ","
                )
                ofile.write(str(list_dict.get("DutyOn", 50)) + ",")
                ofile.write(str(list_dict.get("Period", 0)) + ",")
                priority = str(list_dict.get("Priority", "Blink"))
                ofile.write("phosphor::led::Layout::Action::" + priority + ",")
                ofile.write("},\n")
            ofile.write("   }},\n")
        ofile.write("};\n")
