#!/usr/bin/python

'''
Copyright 2014 Google Inc.

Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
'''

import os
import optparse
import posixpath
import re


def is_ignored(full_path, ignore_list):
  for ignore_path in ignore_list:
    if re.match(full_path, ignore_path, re.I):
      return True
  return False


def find_header_files(include_dirs, ignore_list):
  """Return a list of all '.h' files in top_dir.

  Args:
      include_dirs: Paths to the directories within which to recursively search
          for files ending in '.h'
      ignore_list: Paths to both files and directories that are to be excluded
          from the search for headers

  Returns:
      A list of all the files inside include_dirs that end in '.h', relative to
          their respective include_dir that are not explicitly ignored.
  """
  headers = []
  for top_dir in include_dirs:
    for filename in os.listdir(top_dir):
      full_path = posixpath.join(top_dir, filename)
      if is_ignored(full_path, ignore_list):
        continue
      elif os.path.isdir(full_path):
        nested_headers = find_header_files([full_path], ignore_list)
        for nested_header in nested_headers:
          headers.append(os.path.join(filename, nested_header))
      elif filename.endswith('.h'):
        headers.append(filename)
  return headers


def GenerateIncludeCPP(output_file, include_dirs, ignore_list):
  headers = find_header_files(include_dirs, ignore_list)

  # Emit resulting source file.
  with open(os.path.join(os.getcwd(), output_file), "w+") as output:
    for header in headers:
      output.write("#include <%s>\n" % header)


def main():
  parser = optparse.OptionParser()
  parser.add_option("--ignore", action="store", type="string", dest="ignore",
                    help="file to write the processed sources array to.")
  parser.set_usage("""generate_include_cpp out.cpp include_dir
      out.cpp: C++ code to be generated.
      include_dirs: directories to traverse for include files""")
  (options, args) = parser.parse_args()

  GenerateIncludeCPP(args[0], args[1:], options.ignore.split())


if __name__ == "__main__":
  main()
