#! /usr/bin/env python

# Copyright 2018 Google Inc.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import argparse
import os
import sys

fmt = '''
target_cpu = "{arch}"
is_debug = {debug}
ndk = "{android_ndk_dir}"
ndk_api = {api_level}
skia_enable_fontmgr_empty = true
skia_enable_pdf = false
skia_skqp_global_error_tolerance = 8
skia_use_dng_sdk = false
skia_use_expat = true
skia_use_icu = false
skia_use_libheif = false
skia_use_lua = false
skia_use_piex = false
skia_tools_require_resources = true
extra_cflags = [ "-DSK_ENABLE_DUMP_GPU", "-DSK_BUILD_FOR_SKQP" ]
'''

def parse_args():
    parser = argparse.ArgumentParser(description='Generate args.gn file.')
    parser.add_argument('target_build_dir')
    parser.add_argument('android_ndk_dir' )
    parser.add_argument('--arch',  metavar='architecture', default='arm',
        help='defaults to "arm", valid values: "arm" "arm64" "x86" "x64"')
    parser.add_argument('--api_level', type=int, metavar='api_level',
        default=26, help='android API level, defaults to 26')
    parser.add_argument('--enable_workarounds', default=False,
        action='store_true', help="enable GPU work-arounds, defaults to false")
    parser.add_argument('--debug', default=False, action='store_true',
        help='compile native code in debug mode, defaults to false')

    # parse the args and convert bools to strings.
    args = parser.parse_args()
    gn_bool = lambda b : 'true' if b else 'false'
    args.enable_workarounds = gn_bool(args.enable_workarounds)
    args.debug = gn_bool(args.debug)
    args.android_ndk_dir = os.path.abspath(args.android_ndk_dir)
    return args

def make_args_gn(out_dir, args):
    if not os.path.exists(out_dir):
        os.makedirs(out_dir)
    with open(os.path.join(out_dir, 'args.gn'), 'w') as o:
        o.write(fmt.format(**args))

if __name__ == '__main__':
    args = parse_args()
    make_args_gn(args.target_build_dir, vars(args))
