#!/usr/bin/env python3.8
# Copyright 2021 The Fuchsia Authors
#
# Use of this source code is governed by a MIT-style
# license that can be found in the LICENSE file or at
# https://opensource.org/licenses/MIT

import argparse
import json
import os
import string

from datetime import datetime

STUB_CONTENTS = string.Template(
    """// Copyright $year The Fuchsia Authors
//
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT

// GENERATED BY //zircon/kernel/lib/code-patching/hermetic-stub.py.
// DO NOT EDIT.

#include <lib/arch/asm.h>
#include <lib/code-patching/asm.h>
#include <$header>  // Defines $case_id.

.text

.function $function_name, global
  .code_patching.blob $size, $case_id
.end_function
""")


def main():
    parser = argparse.ArgumentParser(
        description=
        "Creates an assembly file with a single stub functon to be later patched"
    )
    parser.add_argument("--name", help="The name of the stub function")
    parser.add_argument(
        "--header", help="A header containing patch case ID constants")
    parser.add_argument(
        "--metadata-file",
        metavar="FILE",
        help="a JSON file of hermetic patch alternative metadata")
    parser.add_argument(
        "--depfile", metavar="FILE", help="A dependencies file to write to")
    parser.add_argument(
        "--outfile", metavar="FILE", help="The resulting stub file")
    args = parser.parse_args()

    with open(args.metadata_file, "r") as metadata_file:
        metadata = json.load(metadata_file)

    max_size = 0
    alternatives = []
    for entry in metadata:
        alternative = entry["path"]
        alternatives.append(alternative)
        max_size = max(max_size, os.path.getsize(alternative))

    with open(args.depfile, "w") as depfile:
        depfile.write(
            "%s: %s\n" % (args.outfile, " ".join(sorted(alternatives))))

    with open(args.outfile, "w") as stub:
        stub.write(
            STUB_CONTENTS.substitute(
                year=datetime.today().year,
                header=args.header,
                function_name=args.name,
                # Per the expectations of code_patching_hermetic_stub()'s
                # `case_id_header` parameter.
                case_id="CASE_ID_%s" % args.name.upper(),
                size=max_size,
            ))


if __name__ == "__main__":
    main()
