#!/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 subprocess
import sys
import os

SRC_ROOT = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

def get_out_dir(args):
    target_dir = ''
    if args.target_os == 'android':
        target_dir += 'android_'
    elif args.target_os == 'ios':
        target_dir += 'ios_'

    if args.simulator:
        target_dir += 'sim_'

    if args.debug:
        target_dir += 'Debug'
    else:
        target_dir += 'Release'

    return os.path.join('out', target_dir)

def to_command_line(gn_args):
    def merge(key, value):
        if type(value) is bool:
            return '%s=%s' % (key, 'true' if value else 'false')
        return '%s="%s"' % (key, value)
    return [merge(x, y) for x, y in gn_args.iteritems()]

def to_gn_args(args):
    gn_args = {}

    gn_args['is_debug'] = args.debug
    gn_args['is_clang'] = args.clang and args.target_os not in ['android']

    if args.target_os == 'android':
        gn_args['target_os'] = 'android'
    elif args.target_os == 'ios':
        gn_args['target_os'] = 'ios'
        gn_args['ios_deployment_target'] = '7.0'
        if args.simulator:
            gn_args['use_libjpeg_turbo'] = False
        gn_args['use_ios_simulator'] = args.simulator
    else:
        gn_args['use_aura'] = False
        gn_args['use_glib'] = False
        gn_args['use_system_harfbuzz'] = False

    if args.target_os in ['android', 'ios'] and not args.simulator:
        gn_args['target_cpu'] = 'arm'
    else:
        gn_args['target_cpu'] = 'x64'

    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['use_goma'] = True
      gn_args['goma_dir'] = goma_dir
    elif args.goma and os.path.exists(goma_home_dir):
      gn_args['use_goma'] = True
      gn_args['goma_dir'] = goma_home_dir
    else:
      gn_args['use_goma'] = False
      gn_args['goma_dir'] = None

    return gn_args

def parse_args(args):
  args = args[1:]
  parser = argparse.ArgumentParser(description='A script run` gn gen`.')

  parser.add_argument('--debug', default=True, action='store_true')
  parser.add_argument('--release', default=False, dest='debug', action='store_false')

  parser.add_argument('--target-os', type=str, choices=['android', 'ios'])
  parser.add_argument('--android', dest='target_os', action='store_const', const='android')
  parser.add_argument('--ios', dest='target_os', action='store_const', const='ios')
  parser.add_argument('--simulator', action='store_true', default=False)

  parser.add_argument('--goma', default=True, action='store_true')
  parser.add_argument('--no-goma', dest='goma', action='store_false')

  parser.add_argument('--clang', default=True, action='store_true')
  parser.add_argument('--no-clang', dest='clang', action='store_false')

  return parser.parse_args(args)

def main(argv):
  args = parse_args(argv)
  command = ['gn', 'gen', '--check']
  gn_args = to_command_line(to_gn_args(args))
  out_dir = get_out_dir(args)
  print "gn gen --check in %s" % out_dir
  command.append(out_dir)
  command.append('--args=%s' % ' '.join(gn_args))
  return subprocess.call(command, cwd=SRC_ROOT)


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