#!/usr/bin/env python2.7
# Copyright 2018 The Fuchsia 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 json
import os
import sys

sys.path.append(os.path.join(
    os.path.dirname(__file__),
    os.pardir,
    "cpp",
))
import binaries


def main():
    parser = argparse.ArgumentParser('Builds a metadata file')
    parser.add_argument('--out',
                        help='Path to the output file',
                        required=True)
    parser.add_argument('--name',
                        help='Name of the library',
                        required=True)
    parser.add_argument('--format',
                        help='Format of the library',
                        choices=['shared', 'static'],
                        required=True)
    parser.add_argument('--root',
                        help='Root of the library in the SDK',
                        required=True)
    parser.add_argument('--deps',
                        help='Path to metadata files of dependencies',
                        nargs='*')
    parser.add_argument('--headers',
                        help='List of public headers',
                        nargs='*')
    parser.add_argument('--include-dir',
                        help='Path to the include directory',
                        required=True)
    parser.add_argument('--arch',
                        help='Name of the target architecture',
                        required=True)
    parser.add_argument('--lib-link',
                        help='Path to the link-time library in the SDK',
                        required=True)
    parser.add_argument('--lib-dist',
                        help='Path to the library to add to Fuchsia packages in the SDK',
                        required=False)
    parser.add_argument('--dist-path',
                        help='Path to the library in Fuchsia packages',
                        required=False)
    parser.add_argument('--lib-debug-file',
                        help='Path to the source debug version of the library',
                        required=False)
    parser.add_argument('--debug-mapping',
                        help='Path to the file where to write the file mapping for the debug library',
                        required=False)
    args = parser.parse_args()

    metadata = {
        'type': 'cc_prebuilt_library',
        'name': args.name,
        'root': args.root,
        'format': args.format,
        'headers': args.headers,
        'include_dir': args.include_dir,
    }
    metadata['binaries'] = {
        args.arch: {
            'link': args.lib_link,
        },
    }

    if args.lib_debug_file:
        # The path of the debug file in the SDK depends on its build id.
        debug_path = binaries.get_sdk_debug_path(args.lib_debug_file)
        with open(args.debug_mapping, 'w') as mappings_file:
            mappings_file.write(debug_path + '=' + args.lib_debug_file + '\n')
        metadata['binaries'][args.arch]['debug'] = debug_path

    if args.lib_dist:
        metadata['binaries'][args.arch]['dist'] = args.lib_dist
        metadata['binaries'][args.arch]['dist_path'] = args.dist_path

    deps = []
    for spec in args.deps:
        with open(spec, 'r') as spec_file:
            data = json.load(spec_file)
        type = data['type']
        name = data['name']
        # TODO(DX-498): verify that source libraries are header-only.
        if type == 'cc_source_library' or type == 'cc_prebuilt_library':
            deps.append(name)
        else:
            raise Exception('Unsupported dependency type: %s' % type)
    metadata['deps'] = sorted(deps)

    with open(args.out, 'w') as out_file:
        json.dump(metadata, out_file, indent=2, sort_keys=True,
                  separators=(',', ': '))

    return 0


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