#!/usr/bin/env python -u

# Copyright (C) 2019 Apple Inc. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1.  Redistributions of source code must retain the above copyright
#     notice, this list of conditions and the following disclaimer.
# 2.  Redistributions in binary form must reproduce the above copyright
#     notice, this list of conditions and the following disclaimer in the
#     documentation and/or other materials provided with the distribution.
# 3.  Neither the name of Apple Inc. ("Apple") nor the names of
#     its contributors may be used to endorse or promote products derived
#     from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

import argparse
import json


def readJSONFile(path):
    with open(path, 'r') as contents:
        return json.load(contents)


def deepAppend(value1, value2, currentKey=None):
    if type(value1) != type(value2):
        raise TypeError("values have different types for key: {}, {} and {}".format(currentKey, type(value1), type(value2)))
    if isinstance(value1, list):
        return value1 + value2

    result = {};
    for key in (value1.keys() + value2.keys()):
        if key not in result:
            result[key] = deepAppend(value1[key], value2[key], key)
    return result

def mergeJSONs(jsons):
    if len(jsons) == 0:
        raise TypeError("no jsons to merge")

    last = jsons.pop()
    return reduce(deepAppend, jsons, last)

def main():
    parser = argparse.ArgumentParser(description="Merge the resulting json files from multiple invocations of the run_benchmark script.")

    parser.add_argument("-o",
        type=str,
        required=False,
        help="File to put the merged json into prints to standard out if nothing is passed")
    parser.add_argument("jsons",
        type=str,
        nargs='+',
        help="The json files to be merged.")

    # parse_args will error on our list of incomming JSON files...
    args = parser.parse_args()

    result = mergeJSONs(list(map(readJSONFile, args.jsons)))

    if args.o:
        with open(args.o, 'w') as f:
            json.dump(result, f)
    else:
        print(json.dumps(result))


if __name__ == "__main__":
    main()
