#!/usr/bin/env python3
# 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

from difl.ir import Libraries
from difl.library import libraries_changes
from difl.abi import abi_changes
from difl.text_output import text_output
from difl.tricium_output import tricium_output
from difl.comparator import Comparator

ap = argparse.ArgumentParser(prog='difl')

before_group = ap.add_mutually_exclusive_group(required=True)
before_group.add_argument(
    '--before', type=str, help='the .fidl.json from before the change')
before_group.add_argument(
    '--before-files',
    type=str,
    help='a list of .fidl.json files from before the change')

after_group = ap.add_mutually_exclusive_group(required=True)
after_group.add_argument(
    '--after', type=str, help='the .fidl.json from after the change')
after_group.add_argument(
    '--after-files',
    type=str,
    help='a list of .fidl.json files from after the change')

ap.add_argument('--format', choices=['text', 'tricium'], default='text')
args = ap.parse_args()

before_libraries = Libraries()
if args.before:
    before_libraries.load(args.before)
else:
    before_libraries.load_all(args.before_files)

after_libraries = Libraries()
if args.after:
    after_libraries.load(args.after)
else:
    after_libraries.load_all(args.after_files)

changes = libraries_changes(before_libraries, after_libraries, Comparator())

classified_changes = abi_changes(changes)

if args.format == 'text':
    text_output(classified_changes)
elif args.format == 'tricium':
    tricium_output(classified_changes)
