#!/usr/bin/env fuchsia-vendored-python
# Copyright 2019 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.
"""Generate a Fuchsia component manifest for graphics compute targets."""
from __future__ import print_function

import os
import argparse
import json
import sys

_COMPONENT_TYPES = [
    "executable",
    "test",
]


def main(argv):
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument("--name", required=True, help="Component name")
    parser.add_argument(
        "--type",
        default="executable",
        choices=_COMPONENT_TYPES,
        help="Component type",
    )
    parser.add_argument(
        "--needs-vulkan", action="store_true", help="Component needs Vulkan."
    )
    parser.add_argument(
        "--needs-vulkan-framebuffer",
        action="store_true",
        help="Component needs Vulkan and framebuffer access.",
    )
    parser.add_argument("--output", help="Optional output file path.")

    args = parser.parse_args(argv)

    if not args.output:
        output = sys.stdout
    else:
        output = open(args.output, "w")

    needs_vulkan = args.needs_vulkan or args.needs_vulkan_framebuffer

    # Output is a JSON dictionary.
    content = {
        "include": ["syslog/client.shard.cml"],
        "program": {"binary": "bin/" + args.name},
    }

    # Is this a gtest?
    if args.type in ("test"):
        content["include"] += [
            "//src/sys/test_runners/gtest/default.shard.cml",
        ]

    # Is this an executable?
    if args.type in ("executable"):
        content["program"]["runner"] = "elf"
        content["program"]["forward_stdout_to"] = "log"
        content["program"]["forward_stderr_to"] = "log"

    # A Vulkan executable typically reads/writes a pipeline cache.
    if needs_vulkan:
        content["include"] += [
            "vulkan/client.shard.cml",
        ]
        content["use"] = [
            {
                "storage": "cache",
                "path": "/cache",
                "rights": ["rw*"],
            },
        ]

        # Is this Vulkan and an executable?
        if args.type in ("executable"):
            content["use"] += [
                {
                    "storage": "tmp",
                    "path": "/tmp",
                    "rights": ["w*"],
                },
                {
                    "directory": "dev-display-coordinator",
                    "path": "/dev/class/display-coordinator",
                    "rights": ["rw*"],
                },
                {
                    "directory": "dev-input-report",
                    "path": "/dev/class/input-report",
                    "rights": ["rw*"],
                },
            ]

    json.dump(content, output, indent=4, separators=(",", ": "), sort_keys=True)
    output.close()


if __name__ == "__main__":
    main(sys.argv[1:])
