#!/usr/bin/env python

# Copyright 2019 Google LLC.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""
 Generate C/C++ headers and source files from the set of FIDL files
 specified in the meta.json manifest.
"""

import argparse
import collections
import json
import os
import subprocess
import sys

def GetFIDLFilesRecursive(libraries, sdk_base, path):
  with open(path) as json_file:
    parsed = json.load(json_file)
    result = []
    deps = parsed['deps']
    for dep in deps:
      dep_meta_json = os.path.abspath('%s/fidl/%s/meta.json' % (sdk_base, dep))
      GetFIDLFilesRecursive(libraries, sdk_base, dep_meta_json)
    libraries[parsed['name']] = result + parsed['sources']

def GetFIDLFilesByLibraryName(sdk_base, root):
  libraries = collections.OrderedDict()
  GetFIDLFilesRecursive(libraries, sdk_base, root)
  return libraries

def main():
  parser = argparse.ArgumentParser()

  parser.add_argument('--fidlc-bin', dest='fidlc_bin', action='store', required=True)
  parser.add_argument('--fidlgen-bin', dest='fidlgen_bin', action='store', required=True)

  parser.add_argument('--sdk-base', dest='sdk_base', action='store', required=True)
  parser.add_argument('--root', dest='root', action='store', required=True)
  parser.add_argument('--json', dest='json', action='store', required=True)
  parser.add_argument('--include-base', dest='include_base', action='store', required=True)
  parser.add_argument('--output-base-cc', dest='output_base_cc', action='store', required=True)

  args = parser.parse_args()

  assert os.path.exists(args.fidlc_bin)
  assert os.path.exists(args.fidlgen_bin)

  fidl_files_by_name = GetFIDLFilesByLibraryName(args.sdk_base, args.root)

  fidlc_command = [
    args.fidlc_bin,
    '--json',
    args.json
  ]

  for _, fidl_files in fidl_files_by_name.iteritems():
    fidlc_command.append('--files')
    for fidl_file in fidl_files:
      fidl_abspath = os.path.abspath('%s/%s' % (args.sdk_base, fidl_file))
      fidlc_command.append(fidl_abspath)

  subprocess.check_call(fidlc_command)

  assert os.path.exists(args.json)

  fidlgen_command = [
    args.fidlgen_bin,
    '-generators',
    'cpp',
    '-include-base',
    args.include_base,
    '-json',
    args.json,
    '-output-base',
    args.output_base_cc
  ]

  subprocess.check_call(fidlgen_command)

  return 0

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