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

"""Fix header files missing in GN.

This script takes the missing header files from check_gn_headers.py, and
try to fix them by adding them to the GN files.
Manual cleaning up is likely required afterwards.
"""

from __future__ import print_function

import argparse
import os
import re
import subprocess
import sys


def GitGrep(pattern):
  p = subprocess.Popen(
      ['git', 'grep', '-En', pattern, '--', '*.gn', '*.gni'],
      stdout=subprocess.PIPE)
  out, _ = p.communicate()
  return out, p.returncode


def ValidMatches(basename, cc, grep_lines):
  """Filter out 'git grep' matches with header files already."""
  matches = []
  for line in grep_lines:
    gnfile, linenr, contents = line.split(':')
    linenr = int(linenr)
    new = re.sub(cc, basename, contents)
    lines = open(gnfile).read().splitlines()
    assert contents in lines[linenr - 1]
    # Skip if it's already there. It could be before or after the match.
    if lines[linenr] == new:
      continue
    if lines[linenr - 2] == new:
      continue
    print('    ', gnfile, linenr, new)
    matches.append((gnfile, linenr, new))
  return matches


def AddHeadersNextToCC(headers, skip_ambiguous=True):
  """Add header files next to the corresponding .cc files in GN files.

  When skip_ambiguous is True, skip if multiple .cc files are found.
  Returns unhandled headers.

  Manual cleaning up is likely required, especially if not skip_ambiguous.
  """
  edits = {}
  unhandled = []
  for filename in headers:
    filename = filename.strip()
    if not (filename.endswith('.h') or filename.endswith('.hh')):
      continue
    basename = os.path.basename(filename)
    print(filename)
    cc = r'\b' + os.path.splitext(basename)[0] + r'\.(cc|cpp|mm)\b'
    out, returncode = GitGrep('(/|")' + cc + '"')
    if returncode != 0 or not out:
      unhandled.append(filename)
      continue

    matches = ValidMatches(basename, cc, out.splitlines())

    if len(matches) == 0:
      continue
    if len(matches) > 1:
      print('\n[WARNING] Ambiguous matching for', filename)
      for i in enumerate(matches, 1):
        print('%d: %s' % (i[0], i[1]))
      print()
      if skip_ambiguous:
        continue

      picked = raw_input('Pick the matches ("2,3" for multiple): ')
      try:
        matches = [matches[int(i) - 1] for i in picked.split(',')]
      except (ValueError, IndexError):
        continue

    for match in matches:
      gnfile, linenr, new = match
      print('  ', gnfile, linenr, new)
      edits.setdefault(gnfile, {})[linenr] = new

  for gnfile in edits:
    lines = open(gnfile).read().splitlines()
    for l in sorted(edits[gnfile].keys(), reverse=True):
      lines.insert(l, edits[gnfile][l])
    open(gnfile, 'w').write('\n'.join(lines) + '\n')

  return unhandled


def AddHeadersToSources(headers, skip_ambiguous=True):
  """Add header files to the sources list in the first GN file.

  The target GN file is the first one up the parent directories.
  This usually does the wrong thing for _test files if the test and the main
  target are in the same .gn file.
  When skip_ambiguous is True, skip if multiple sources arrays are found.

  "git cl format" afterwards is required. Manually cleaning up duplicated items
  is likely required.
  """
  for filename in headers:
    filename = filename.strip()
    print(filename)
    dirname = os.path.dirname(filename)
    while not os.path.exists(os.path.join(dirname, 'BUILD.gn')):
      dirname = os.path.dirname(dirname)
    rel = filename[len(dirname) + 1:]
    gnfile = os.path.join(dirname, 'BUILD.gn')

    lines = open(gnfile).read().splitlines()
    matched = [i for i, l in enumerate(lines) if ' sources = [' in l]
    if skip_ambiguous and len(matched) > 1:
      print('[WARNING] Multiple sources in', gnfile)
      continue

    if len(matched) < 1:
      continue
    print('  ', gnfile, rel)
    index = matched[0]
    lines.insert(index + 1, '"%s",' % rel)
    open(gnfile, 'w').write('\n'.join(lines) + '\n')


def RemoveHeader(headers, skip_ambiguous=True):
  """Remove non-existing headers in GN files.

  When skip_ambiguous is True, skip if multiple matches are found.
  """
  edits = {}
  unhandled = []
  for filename in headers:
    filename = filename.strip()
    if not (filename.endswith('.h') or filename.endswith('.hh')):
      continue
    basename = os.path.basename(filename)
    print(filename)
    out, returncode = GitGrep('(/|")' + basename + '"')
    if returncode != 0 or not out:
      unhandled.append(filename)
      print('  Not found')
      continue

    grep_lines = out.splitlines()
    matches = []
    for line in grep_lines:
      gnfile, linenr, contents = line.split(':')
      print('    ', gnfile, linenr, contents)
      linenr = int(linenr)
      lines = open(gnfile).read().splitlines()
      assert contents in lines[linenr - 1]
      matches.append((gnfile, linenr, contents))

    if len(matches) == 0:
      continue
    if len(matches) > 1:
      print('\n[WARNING] Ambiguous matching for', filename)
      for i in enumerate(matches, 1):
        print('%d: %s' % (i[0], i[1]))
      print()
      if skip_ambiguous:
        continue

      picked = raw_input('Pick the matches ("2,3" for multiple): ')
      try:
        matches = [matches[int(i) - 1] for i in picked.split(',')]
      except (ValueError, IndexError):
        continue

    for match in matches:
      gnfile, linenr, contents = match
      print('  ', gnfile, linenr, contents)
      edits.setdefault(gnfile, set()).add(linenr)

  for gnfile in edits:
    lines = open(gnfile).read().splitlines()
    for l in sorted(edits[gnfile], reverse=True):
      lines.pop(l - 1)
    open(gnfile, 'w').write('\n'.join(lines) + '\n')

  return unhandled


def main():
  parser = argparse.ArgumentParser()
  parser.add_argument('input_file', help="missing or non-existing headers, "
                      "output of check_gn_headers.py")
  parser.add_argument('--prefix',
                      help="only handle path name with this prefix")
  parser.add_argument('--remove', action='store_true',
                      help="treat input_file as non-existing headers")

  args, _extras = parser.parse_known_args()

  headers = open(args.input_file).readlines()

  if args.prefix:
    headers = [i for i in headers if i.startswith(args.prefix)]

  if args.remove:
    RemoveHeader(headers, False)
  else:
    unhandled = AddHeadersNextToCC(headers)
    AddHeadersToSources(unhandled)


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