#!/usr/bin/env python
#
# 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 sys
import subprocess
import os
import argparse
import errno
import shutil

def GetGNFiles(directory):
  directory = os.path.abspath(directory)
  gn_files = []
  assert os.path.exists(directory), "Directory must exist %s" % directory
  for root, dirs, files in os.walk(directory):
    for file in files:
        if file.endswith(".gn") or file.endswith(".gni"):
          gn_files.append(os.path.join(root, file))
  return gn_files

def main():
  parser = argparse.ArgumentParser();

  parser.add_argument('--gn-binary', dest='gn_binary', required=True, type=str)
  parser.add_argument('--dry-run', dest='dry_run', default=False, action='store_true')
  parser.add_argument('--root-directory', dest='root_directory', required=True, type=str)

  args = parser.parse_args()

  gn_binary = os.path.abspath(args.gn_binary)
  assert os.path.exists(gn_binary), "GN Binary must exist %s" % gn_binary

  gn_command = [ gn_binary, 'format']

  if args.dry_run:
    gn_command.append('--dry-run')

  for gn_file in GetGNFiles(args.root_directory):
    if subprocess.call(gn_command + [ gn_file ]) != 0:
      print "ERROR: '%s' is incorrectly formatted." % os.path.relpath(gn_file, args.root_directory)
      print "Format the same with 'gn format' using the 'gn' binary in third_party/gn/gn."
      print "Or, run ./ci/check_gn_format.py without '--dry-run'"
      return 1

  return 0

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