#!/usr/bin/env python3
# Copyright 2022 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.
"""Convert the binary Bazel workspace log to text format."""

import argparse
import os
import shlex
import subprocess
import sys
from typing import Optional

_SCRIPT_DIR = os.path.dirname(__file__)
_FUCHSIA_DIR = os.path.abspath(os.path.join(_SCRIPT_DIR, "..", "..", ".."))

sys.path.insert(0, _SCRIPT_DIR)
import build_utils


def find_default_log_file() -> Optional[str]:
    """Find the location of the default log file.

    Returns:
        Path to the default log file, or None if it could not be determined.
    """
    fuchsia_dir = build_utils.find_fuchsia_dir()
    if not fuchsia_dir:
        return None

    build_dir = build_utils.find_fx_build_dir(fuchsia_dir)
    if not build_dir:
        return None

    top_dir = os.path.join(build_dir, build_utils.get_bazel_topdir(fuchsia_dir))
    log_file = os.path.join(top_dir, "logs", "workspace-events.log")
    return log_file


def main() -> int:
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument(
        "--jre",
        help="Specify Java JRE used to run the parser, default uses the prebuilt Bazel JRE.",
    )
    parser.add_argument(
        "--log-parser-jar",
        help="Specify alternative location for parser .jar file.",
    )
    parser.add_argument(
        "--exclude_rule",
        action="append",
        default=[],
        help="Rule(s) to filter out while parsing.",
    )
    parser.add_argument(
        "--output_path",
        help="Output file location. If not used, output goes to stdout.",
    )
    parser.add_argument("--log_file", help="Input log file (auto-detected).")
    parser.add_argument(
        "--verbose", action="store_true", help="Enable verbose mode."
    )
    args = parser.parse_args()

    # Find the Java Runtime Environment to run the parser first.
    java_binary = os.path.join("bin", "java")
    if sys.platform.startswith("win"):
        java_binary += ".exe"

    def find_java_binary(jre_path: str) -> Optional[str]:
        path = os.path.join(jre_path, java_binary)
        return path if os.path.exists(path) else None

    if args.jre:
        java_launcher = find_java_binary(args.jre)
        if not java_launcher:
            parser.error("Invalid JRE path: " + args.jre)
            return 1
    else:
        # Auto-detect the prebuilt bazel JRE first
        prebuilt_bazel_jdk = os.path.join(
            _FUCHSIA_DIR,
            "prebuilt",
            "third_party",
            "bazel",
            build_utils.get_host_tag(),
            "install_base",
            "embedded_tools",
            "jdk",
        )
        java_launcher = find_java_binary(prebuilt_bazel_jdk)
        if not java_launcher:
            print(
                "ERROR: Missing prebuilt Bazel JDK launcher, please use --jre=<DIR>: %s/%s"
                % (prebuilt_bazel_jdk, java_binary),
                file=sys.stderr,
            )
            return 1

    def verbose(msg: str) -> None:
        if args.verbose:
            print("DEBUG: " + msg, file=sys.stderr)

    # Find the parser JAR file now.
    if args.log_parser_jar:
        log_parser_jar = args.log_parser_jar
    else:
        log_parser_jar = os.path.join(
            _FUCHSIA_DIR,
            "prebuilt",
            "third_party",
            "bazel_workspacelogparser",
            "bazel_workspacelogparser.jar",
        )

    if not os.path.exists(log_parser_jar):
        parser.error("Missing parser file: " + log_parser_jar)

    verbose("Using jar file at: " + log_parser_jar)

    log_file = args.log_file
    if not args.log_file:
        log_file = find_default_log_file()
        if not log_file:
            print(
                "ERROR: Could not find default log file, please use --log_file=FILE",
                file=sys.stderr,
            )
            return 1

    verbose("Using log file at: " + log_file)

    cmd = [java_launcher, "-jar", log_parser_jar, "--log_path=" + log_file]
    cmd += ["--exclude_rule=" + rule for rule in args.exclude_rule]
    if args.output_path:
        cmd += ["--output_path=" + args.output_path]

    verbose("Running command: %s" % " ".join([shlex.quote(c) for c in cmd]))

    return subprocess.run(cmd).returncode


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