#!/usr/bin/env python3

import argparse
import glob
import os

from pyprd.chip_data.binary import binary_encode
from pyprd.chip_data.json import json_decode
from pyprd.chip_data.peltool import peltool_encode


def _import_chip_data(indir: str) -> dict:
    """
    Iterates each JSON file in the given directory (all of which should be
    properly formated Chip Data JSON). Then, combines the data into a singular
    chip_data.Base object for each model/EC.
    """

    bases = dict()

    for file in glob.glob(os.path.join(indir, "*.json")):
        with open(file, "r") as fp:
            for base in json_decode(fp).split():
                # Should be only one model/EC
                assert 1 == len(base.model_ec)
                model_ec = base.model_ec[0]

                if model_ec not in bases:
                    bases[model_ec] = base
                else:
                    bases[model_ec].merge(base)

    return bases


def gen_chip_data_binary(indir: str, outdir: str) -> None:
    for model_ec, base in _import_chip_data(indir).items():
        file = f"chip_data_{model_ec.lower()}.cdb"
        with open(os.path.join(outdir, file), "wb") as fp:
            binary_encode(model_ec, base, fp)


def gen_peltool_json(indir: str, outdir: str) -> None:
    for model_ec, base in _import_chip_data(indir).items():
        file = f"pel_parser_data_{model_ec.lower()}.json"
        with open(os.path.join(outdir, file), "w") as fp:
            peltool_encode(model_ec, base, fp)


if __name__ == "__main__":
    parser = argparse.ArgumentParser(
        description="""
        Parses the target Chip Data files and generates specified data files.
        """
    )

    parser.add_argument(
        "format",
        type=str,
        metavar="<format>",
        choices=["bin", "pel"],
        help="""
        Output data type: 'bin' => Chip Data binary, 'pel' => BMC peltool JSON.
        """,
    )

    parser.add_argument(
        "indir",
        type=str,
        metavar="<input_path>",
        help="""
        Input directory containing the Chip Data files.
        """,
    )

    parser.add_argument(
        "outdir",
        type=str,
        metavar="<output_path>",
        help="""
        Output directory for the generated data.
        """,
    )

    args = parser.parse_args()

    funcs = {
        "bin": "gen_chip_data_binary",
        "pel": "gen_peltool_json",
    }

    globals()[funcs[args.format]](args.indir, args.outdir)
