#
# Copyright (C) 2018 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
"""Generates a compile_commands.json file for the given ndk-build project.

The compilation commands for this file are read from the files passed as
arguments to this script.
"""
from __future__ import print_function

import argparse
import json
import os
from pathlib import Path


def parse_args() -> argparse.Namespace:
    """Parses and returns command line arguments."""
    parser = argparse.ArgumentParser()

    parser.add_argument(
        "-o", "--output", type=os.path.realpath, help="Path to output file"
    )  # type: ignore

    def maybe_list_file(arg: str) -> str:
        if arg.startswith("@"):
            return "@" + os.path.realpath(arg[1:])
        return os.path.realpath(arg)

    parser.add_argument(
        "command_files",
        metavar="FILE",
        type=maybe_list_file,
        nargs="+",
        help=(
            "Path to the compilation database for a single object. If the "
            "argument begins with @ it will be treated as a list file "
            "containing paths to the one or more JSON files."
        ),
    )

    return parser.parse_args()


def main() -> None:
    """Program entry point."""
    args = parse_args()

    all_commands = []
    command_files = []
    for command_file in args.command_files:
        if command_file.startswith("@"):
            list_file = Path(command_file[1:])
            command_files.extend(list_file.read_text(encoding="utf-8").split())
        else:
            command_files.append(command_file)

    for command_file_path in command_files:
        with open(command_file_path, encoding="utf-8") as command_file:
            all_commands.append(json.load(command_file))

    with open(args.output, "w", encoding="utf-8") as out_file:
        json.dump(
            all_commands, out_file, sort_keys=True, indent=4, separators=(",", ": ")
        )


if __name__ == "__main__":
    main()
