#!/usr/bin/env python3.8
# 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(fxbug.dev/5535): 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 = [a['id'] for a in manifest['atoms']]

    # Ignore images which are very architecture-dependent.
    # TODO(fxbug.dev/5824): remove this exception when obsolete.
    ids = [i for i in ids if not (i.startswith('sdk://images'))]

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

    with open(args.reference, 'r') as reference_file:
        old_ids = [l.strip() for l in reference_file.readlines()]

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

    ids = filter(lambda i: not i.startswith('sdk://fidl/zx'), ids)
    old_ids = filter(lambda i: not i.startswith('sdk://fidl/zx'), old_ids)

    ids = filter(lambda i: not i.startswith('sdk://fidl/zx'), ids)
    old_ids = filter(lambda i: not i.startswith('sdk://fidl/zx'), 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())
