#!/usr/bin/env python3
# Copyright (C) 2017 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

from __future__ import print_function

import os
import re
import sys

from codecs import open
from compat import xrange


def fix_guards(fpath, checkonly):
  with open(fpath, 'r', encoding='utf-8') as f:
    lines = [l.strip('\n') for l in f.readlines()]

  if any(x.startswith('// fix_include_guards: off') for x in lines):
    return 0

  res = []
  guard = re.sub(r'[^a-zA-Z0-9_-]', '_', fpath.upper()) + '_'
  replacements = 0

  endif_line_idx = -1
  for line_idx in xrange(len(lines) - 1, -1, -1):
    if lines[line_idx].startswith('#endif'):
      endif_line_idx = line_idx
      break
  assert endif_line_idx > 0, fpath

  line_idx = 0
  for line in lines:
    if replacements == 0 and line.startswith('#ifndef '):
      line = '#ifndef ' + guard
      replacements = 1
    elif replacements == 1 and line.startswith('#define '):
      line = '#define ' + guard
      replacements = 2
    elif line_idx == endif_line_idx and replacements == 2:
      assert (line.startswith('#endif'))
      line = '#endif  // ' + guard
    res.append(line)
    line_idx += 1
  if res == lines:
    return 0
  if checkonly:
    print('Wrong #include guards in %s' % fpath, file=sys.stderr)
    return 1
  with open(fpath, 'w', encoding='utf-8') as f:
    f.write('\n'.join(res) + '\n')
  return 1


def main():
  checkonly = '--check-only' in sys.argv
  num_files_changed = 0
  for topdir in ('src', 'include', 'src/profiling/memory/include', 'test',
                 'tools'):
    for root, dirs, files in os.walk(topdir):
      for name in files:
        if not name.endswith('.h'):
          continue
        fpath = os.path.join(root, name)
        num_files_changed += fix_guards(fpath, checkonly)
  if checkonly:
    return 0 if num_files_changed == 0 else 1
  else:
    print('%d files changed' % num_files_changed)


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