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