#!/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


def has_packaged_file(needed_file, deps):
    """Returns true if the given file could be found in the given deps."""
    for dep in deps:
        for file in dep['files']:
            if needed_file == os.path.normpath(file['source']):
                return True
    return False


def has_missing_files(runtime_files, package_deps):
    """Returns true if a runtime file is missing from the given deps."""
    has_missing_files = False
    for file in runtime_files:
        # Some libraries are only known to GN as ABI stubs, whereas the real
        # runtime dependency is generated in parallel as a ".so.impl" file.
        if (not has_packaged_file(file, package_deps) and
                not has_packaged_file('%s.impl' % file, package_deps)):
            print('No package dependency generates %s' % file)
            has_missing_files = True
    return has_missing_files


def main():
    parser = argparse.ArgumentParser(
            "Verifies a prebuilt library's runtime dependencies")
    parser.add_argument('--root-build-dir',
                        help='Path to the root build directory',
                        required=True)
    parser.add_argument('--runtime-deps-file',
                        help='Path to the list of runtime deps',
                        required=True)
    parser.add_argument('--manifest',
                        help='Path to the target\'s SDK manifest file',
                        required=True)
    parser.add_argument('--stamp',
                        help='Path to the stamp file to generate',
                        required=True)
    args = parser.parse_args()

    # Read the list of runtime dependencies generated by GN.
    def normalize_dep(dep):
        return os.path.normpath(os.path.join(args.root_build_dir, dep.strip()))
    with open(args.runtime_deps_file, 'r') as runtime_deps_file:
        runtime_files = map(normalize_dep, runtime_deps_file.readlines())

    # Read the list of package dependencies for the library's SDK incarnation.
    with open(args.manifest, 'r') as manifest_file:
        manifest = json.load(manifest_file)
    atom_id = manifest['ids'][0]
    def find_atom(id):
        return next(a for a in manifest['atoms'] if a['id'] == id)
    atom = find_atom(atom_id)
    deps = map(lambda a: find_atom(a), atom['deps'])
    deps += [atom]

    # Check whether all runtime files are available for packaging.
    if has_missing_files(runtime_files, deps):
        return 1

    with open(args.stamp, 'w') as stamp:
        stamp.write('Success!')


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