#!/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)
  parser.add_argument('--output-c-tables', dest='output_c_tables', 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,
    '--tables',
    args.output_c_tables,
    '--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())
