#!/usr/bin/env fuchsia-vendored-python
# Copyright 2024 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Collects useful metadata for describing package archives.
For use in the template //build/packages:exported_fuchsia_package_archive."""

import argparse
import json
import sys

from pathlib import Path


def parse_args() -> argparse.Namespace:
    parser = argparse.ArgumentParser()

    def path_arg(validate_type=None):
        def arg(path):
            path = Path(path)
            assert (
                not validate_type
                or validate_type == "file"
                and path.is_file()
                or validate_type == "directory"
                and path.is_dir()
            ), f'Path "{path}" is not a {validate_type}!'
            return path

        return arg

    parser.add_argument(
        "--far",
        help="A path to the package archive.",
        type=path_arg("file"),
        required=True,
    )
    parser.add_argument(
        "--package-manifest",
        help="A path to the underlying package's manifest.",
        type=path_arg("file"),
        required=True,
    )
    parser.add_argument(
        "--cpu",
        help="The underlying package's target cpu architecture.",
        required=True,
    )
    parser.add_argument(
        "--api-level",
        help="The underlying package's target api level.",
        type=int,
        required=True,
    )
    parser.add_argument(
        "--out",
        help="The path to write the json metadata for the package archive.",
        type=path_arg(),
        required=True,
    )
    return parser.parse_args()


def main() -> int:
    args = parse_args()

    package_manifest = json.loads(args.package_manifest.read_text())
    args.out.write_text(
        json.dumps(
            {
                "name": package_manifest["package"]["name"],
                "cpu": args.cpu,
                "api_level": args.api_level,
                "path": str(args.far),
            }
        )
    )

    return 0


if __name__ == "__main__":
    sys.exit(main())
