#!/usr/bin/env python
# Copyright 2015 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.

import argparse
import logging
import os
import subprocess
import sys

_logger = logging.getLogger()
_root_path = os.path.realpath(os.path.dirname(__file__))

def _linux_out_dir(args):
  if args.debug:
      return os.path.join(_root_path, 'out/Debug')
  return os.path.join(_root_path, 'out/Release')

def _android_out_dir(args):
  if args.debug:
    return os.path.join(_root_path, 'out/android_Debug')
  return os.path.join(_root_path, 'out/android_Release')


def _init_logging(verbose_count):
  if verbose_count == 0:
    level = logging.WARNING
  elif verbose_count == 1:
    level = logging.INFO
  else:
    level = logging.DEBUG

  logging.basicConfig()
  _logger.setLevel(level)
  _logger.debug('Initialized logging: verbose_count=%d, level=%d' %
               (verbose_count, level))

def _run_gn(gn_args, out_dir):
  # TODO(jamesr): add '--check' to the args.
  command = ['gn', 'gen']
  command.append(out_dir)
  command.append('--args=%s' % ' '.join(gn_args))
  print 'Running %s ...' % (' '.join(command))
  return subprocess.call(command)

_goma_dir_str = 'goma_dir = '
_use_goma_str = 'use_goma = '

def _gn(args):
  _logger.debug('_gn()')

  gn_args = ['is_debug = ' + ('true' if args.debug else 'false')]

  if 'goma' in args:
    goma_dir = os.environ.get('GOMA_DIR')
    goma_home_dir = os.path.join(os.getenv('HOME', ''), 'goma')
    if args.goma and goma_dir:
      gn_args.append(_goma_dir_str + '"' + goma_dir + '"')
      gn_args.append(_use_goma_str + 'true')
    elif args.goma and os.path.exists(goma_home_dir):
      gn_args.append(_goma_dir_str + '"' + goma_home_dir + '"')
      gn_args.append(_use_goma_str + 'true')

  retcode = _run_gn(gn_args, _linux_out_dir(args))
  if retcode != 0:
    return retcode
  gn_args.append('target_os="android"')
  gn_args.append('target_cpu="arm"')
  return _run_gn(gn_args, _android_out_dir(args))

def _run_build(out_dir):
  gn_file = os.path.join(out_dir, 'args.gn')
  use_goma = False
  with open(gn_file, 'r') as f:
    lines = f.readlines()
    for l in lines:
      if l.startswith(_goma_dir_str):
        use_goma = True
        local_goma_dir = l[len(_goma_dir_str)+1:len(l)-2]
        break
  _logger.info('use_goma = %s' % use_goma)
  if use_goma:
    print 'Ensuring goma (in %s) started ...' % local_goma_dir
    command = ['python',
               os.path.join(local_goma_dir, 'goma_ctl.py'),
               'ensure_start']
    retcode = subprocess.call(command)
    if retcode != 0:
      return retcode

    return subprocess.call(['ninja', '-j', '1000', '-l', '100', '-C', out_dir])
  else:
    return subprocess.call(['ninja', '-C', out_dir])

# Unused argument - pylint: disable=W0613
def _build(args):
  _logger.debug('_build()')
  retcode = _run_build(_linux_out_dir(args))
  if retcode != 0:
    return retcode
  return _run_build(_android_out_dir(args))

# Unused argument - pylint: disable=W0613
def _test(args):
  _logger.debug('_test()')
  # TODO(jamesr): Run tests on android too
  out_dir = _linux_out_dir(args)
  return subprocess.call([os.path.join(out_dir, 'mojo_shell'),
      'mojo:network_service_apptests'])

def _upload(args):
  if args.debug:
    print "Only upload release binaries (for now)"
    return 1
  base_command = ['tools/upload_service.py',
                  '--linux-x64-binary-dir', _linux_out_dir(args),
                  '--android-arm-binary-dir', _android_out_dir(args)]
  if args.dry_run:
    base_command.append('--dry-run')
  _logger.info('Uploading network service binary')
  retcode = subprocess.call(base_command + ['--upload-symbols',
                                            'network_service'])
  if retcode != 0:
    return retcode
  _logger.info('Uploading network service apptests binary')
  return subprocess.call(base_command + ['network_service_apptests'])


def main():
  parser = argparse.ArgumentParser(
      description='Script to help build and upload monet')

  parent_parser = argparse.ArgumentParser(add_help=False)
  parent_parser.add_argument('--verbose',
                             help='Be verbose (multiple times for more)',
                             default=0, dest='verbose_count', action='count')

  debug_group = parent_parser.add_mutually_exclusive_group()
  debug_group.add_argument('--debug', help='Debug build (default)',
                           default=True, action='store_true')
  debug_group.add_argument('--release', help='Release build', default=False,
                           dest='debug', action='store_false')

  subparsers = parser.add_subparsers()

  gn_parser = subparsers.add_parser('gn', parents=[parent_parser],
      help='Run gn to generate build files')
  gn_parser.set_defaults(func=_gn)
  gn_parser.add_argument('--args', help='Specify extra args', default=None,
      dest='gn_args')
  goma_group = gn_parser.add_mutually_exclusive_group()
  goma_group.add_argument('--goma',
                          help='Use Goma (if $GOMA_DIR is set or $HOME/goma '
                               'exists; default)',
                          default=True,
                          action='store_true')
  goma_group.add_argument('--no-goma', help='Don\'t use Goma', default=False,
                          dest='goma', action='store_false')

  build_parser = subparsers.add_parser('build', parents=[parent_parser],
      help='Build')
  build_parser.set_defaults(func=_build)

  test_parser = subparsers.add_parser('test', parents=[parent_parser],
      help='Run network service apptests')
  test_parser.set_defaults(func=_test)

  upload_parser = subparsers.add_parser('upload', parents=[parent_parser],
      help='Upload already built binaries to Google Cloud Storage')
  upload_parser.add_argument('--dry-run', '-n',
      help='Dry run (prints what it would upload but does not actually upload)',
      action='store_true')
  upload_parser.set_defaults(func=_upload)

  args = parser.parse_args()
  _init_logging(args.verbose_count)
  return args.func(args)

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