#!/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.

"""
Pre-processes the project.json file emitted by GN to only include target names.

This should be run as part of `fx set` with the flags
`--ide=json --json-ide-script=//scripts/prepare_targets.py`.

This generates a file `//out/default/project_lite.json` which contains a list of
target names available in the build. This file is read by `complete.py` to
provide completions for `fx build`.

Pre-processing the `project.json` file emitted by GN is crucial for completion
performance.
"""

import argparse
import json
import os
import sys


def eprint(*args, **kwargs):
    print(*args, file=sys.stderr, **kwargs)


FUCHSIA_DIR = os.environ["FUCHSIA_DIR"]
DEFAULT_OUT_NAME = "project_lite.json"

try:
    DEFAULT_OUT_DIR = os.environ["FUCHSIA_BUILD_DIR"]
except KeyError:
    DEFAULT_OUT_DIR = os.path.join(FUCHSIA_DIR, "out", "default")


def main(args):
    document_lite = {}
    with open(args.project_file) as fin:
        document = json.load(fin)
        document_lite["targets"] = list(document["targets"].keys())
        project_file = os.path.join(args.build_dir, args.out_name)
        with open(project_file, "w+") as fout:
            json.dump(document_lite, fout)
        print(
            "Wrote JSON targets file for shell completion: {}".format(
                project_file
            )
        )


if __name__ == "__main__":
    p = argparse.ArgumentParser(description=__doc__)
    p.add_argument("--build_dir", default=DEFAULT_OUT_DIR)
    p.add_argument("--out_name", default=DEFAULT_OUT_NAME)
    p.add_argument("project_file")
    try:
        main(p.parse_args())
    except Exception as e:
        eprint("error: {}".format(e))
        sys.exit(1)
