#!/usr/bin/env python3
# Copyright 2013 The Flutter Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import argparse
from pathlib import Path


def main():
  parser = argparse.ArgumentParser(
      description="Generate response file for FIDL frontend. "
      "Arguments not mentioned here are forwarded as is to fidlc."
  )
  parser.add_argument(
      "--out-response-file",
      help="The path for for the response file to generate",
      type=Path,
      required=True
  )
  parser.add_argument(
      "--out-libraries",
      help="The path for for the libraries file to generate",
      type=Path,
      required=True
  )
  parser.add_argument("--sources", help="List of FIDL source files", nargs="+", required=True)
  parser.add_argument("--dep-libraries", help="List of dependent libraries", nargs="*")
  args, args_to_forward = parser.parse_known_args()

  # Each line contains a library's source files separated by spaces.
  # We use a dict instead of a set to maintain insertion order.
  dep_lines = {}
  for path in args.dep_libraries or []:
    with open(path) as f:
      for line in f:
        dep_lines[line.rstrip()] = True
  libraries = list(dep_lines)
  libraries.append(" ".join(sorted(args.sources)))

  args.out_libraries.parent.mkdir(parents=True, exist_ok=True)
  with open(args.out_libraries, "w") as f:
    print("\n".join(libraries), file=f)

  args.out_response_file.parent.mkdir(parents=True, exist_ok=True)
  with open(args.out_response_file, "w") as f:
    fidlc_args = args_to_forward + ["--files " + line for line in libraries]
    print(" ".join(fidlc_args), file=f)


if __name__ == "__main__":
  main()
