#!/usr/bin/python2
#
# Copyright 2019 Google Inc.
#
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import os

roots = [
    'bench',
    'dm',
    'docs',
    'example',
    'experimental',
    'fuzz',
    'gm',
    'include',
    'modules',
    'platform_tools/android/apps',
    'samplecode',
    'src',
    'tests',
    'third_party/etc1',
    'third_party/gif',
    'tools'
  ]

# Map short name -> absolute path for all Skia headers.
headers = {}
for root in roots:
  for path, _, files in os.walk(root):
    for file_name in files:
      if file_name.endswith('.h'):
        if file_name in headers:
          print path, file_name, headers[file_name]
        assert file_name not in headers
        headers[file_name] = os.path.abspath(os.path.join(path, file_name))

# Rewrite any #includes relative to Skia's top-level directory.
for root in roots:
  for path, _, files in os.walk(root):
    if 'generated' in path:
      continue
    for file_name in files:
      if (file_name.endswith('.h') or
          file_name.endswith('.c') or
          file_name.endswith('.m') or
          file_name.endswith('.mm') or
          file_name.endswith('.inc') or
          file_name.endswith('.fp') or
          file_name.endswith('.cc') or
          file_name.endswith('.cpp')):
        # Read the whole file into memory.
        file_path = os.path.join(path, file_name)
        lines = open(file_path).readlines()

        # Write it back out again line by line with substitutions for #includes.
        with open(file_path, 'w') as output:
          includes = []

          for line in lines:
            parts = line.split('"')
            if (len(parts) == 3
                and '#' in parts[0]
                and 'include' in parts[0]
                and os.path.basename(parts[1]) in headers):

              header = headers[os.path.basename(parts[1])]
              includes.append(parts[0] +
                              '"%s"' % os.path.relpath(header, '.') +
                              parts[2])
            else:
              for inc in sorted(includes):
                print >>output, inc.strip('\n')
              includes = []
              print >>output, line.strip('\n')

