#! /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 = 4
skia_use_dng_sdk = false
skia_use_expat = false
skia_use_icu = false
skia_use_libheif = false
skia_use_lua = false
skia_use_piex = false
skia_use_skcms = false
skia_skqp_enable_driver_correctness_workarounds = {enable_workarounds}
'''

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))
