#!/usr/bin/env python3
# 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)
