#!/usr/bin/env python2.7
# Copyright 2019 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 platform
import sys


def main():
    parser = argparse.ArgumentParser()
    # TODO(DX-685): make this argument required.
    parser.add_argument(
        '--reference', help='Path to the golden API file', required=False)
    parser.add_argument(
        '--manifest', help='Path to the SDK manifest', required=True)
    parser.add_argument(
        '--updated', help='Path to the API file to compute', required=True)
    parser.add_argument(
        '--warn',
        help='Whether API changes should only cause warnings',
        action='store_true')
    args = parser.parse_args()

    if not args.reference:
        # Nothing to do.
        with open(args.updated, 'w') as updated_file:
            updated_file.write('No API verification for this SDK :/')
        return 0

    with open(args.manifest, 'r') as manifest_file:
        manifest = json.load(manifest_file)

    ids = map(lambda a: a['id'], manifest['atoms'])

    # Ignore images which are very architecture-dependent.
    # TODO(DX-981): remove this exception when obsolete.
    ids = filter(
        lambda i: not (i.startswith('sdk://images')), ids)

    with open(args.updated, 'w') as updated_file:
        updated_file.write('\n'.join(ids))

    with open(args.reference, 'r') as reference_file:
        old_ids = map(lambda l: l.strip(), reference_file.readlines())

    # tools/arm64 should not exist on mac hosts
    # TODO(fxb/42999): remove when SDK transition is complete.
    if platform.mac_ver()[0]:
        old_ids = filter(lambda i: not i.startswith('sdk://tools/arm64'), old_ids)

    new_id_set = set(ids)
    old_id_set = set(old_ids)
    added_ids = new_id_set - old_id_set
    removed_ids = old_id_set - new_id_set

    if added_ids:
        print('Elements added to SDK:')
        for id in sorted(added_ids):
            print(' - %s' % id)
    if removed_ids:
        print('Elements removed from SDK:')
        for id in sorted(removed_ids):
            print(' - %s' % id)
    if removed_ids or added_ids:
        type = 'Warning' if args.warn else 'Error'
        print('%s: SDK contents have changed!' % type)
        print('Please acknowledge this change by running:')
        print('  cp ' + args.updated + ' ' + args.reference)
        if not args.warn:
            return 1

    return 0


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