#!/usr/bin/env python3
# Copyright lowRISC contributors.
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0

import logging
import shutil
import subprocess
import sys
from pathlib import Path
from typing import List

from autogen_banner import get_autogen_banner
from make_new_dif.ip import Ip
from mako.template import Template

# This file is $REPO_TOP/util/autogen_testutils.py, so it takes two parent()
# calls to get back to the top.
REPO_TOP = Path(__file__).resolve().parent.parent.parent


def gen_testutils(ips_with_difs: List[Ip]) -> None:
    """Generate testutils libraries that are rendered from Mako templates.

    Args:
        ips_with_difs: List of IP objects that have existing DIF libraries.

    Returns:
        None
    """
    # Check clang-format is installed.
    assert (shutil.which("clang-format") and
            "ERROR: clang-format must be installed to format "
            " autogenerated code to pass OpenTitan CI checks.")

    # Sort input so the templates get rendered in the same order every time.
    ips_with_difs.sort(key=lambda ip: ip.name_snake)

    # Define input/output directories.
    testutils_templates_dir = REPO_TOP / "util/autogen_testutils/templates"
    autogen_testutils_dir = REPO_TOP / "sw/device/lib/testing/autogen"

    # Create output directories if needed.
    autogen_testutils_dir.mkdir(exist_ok=True)

    # Render templates.
    for testutils_template_path in testutils_templates_dir.iterdir():
        if testutils_template_path.suffix == ".tpl":
            comment_syntax = "#" if testutils_template_path.stem.endswith(
                ".build") else "//"
            # Read in template, render it, and write it to the output file.
            testutils_template = Template(testutils_template_path.read_text())
            testutils = autogen_testutils_dir / testutils_template_path.stem
            testutils.write_text(
                testutils_template.render(ips_with_difs=ips_with_difs,
                                          autogen_banner=get_autogen_banner(
                                              "util/autogen_testutils.py",
                                              comment=comment_syntax)))

            # Format autogenerated file with clang-format.
            # Note: do not format meson build file.
            if testutils.suffix != ".build":
                try:
                    subprocess.check_call(["clang-format", "-i", testutils])
                except subprocess.CalledProcessError:
                    logging.error(
                        f"failed to format {testutils} with clang-format.")
                    sys.exit(1)

            print(f"testutils successfully written to {str(testutils)}.")
