#!/usr/bin/env python2
# SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
#
# Copyright 2016 IBM Corp.

import json
import sys

json_params = {
    'indent': 1,
    'sort_keys': True,
    'separators': (',', ': '),
}

def get_input():
    while True:
        resp = raw_input("Update pattern to match both? (y/n): ")
        if resp in [ "y", "Y" ]:
            break
        elif resp in [ "n", "N" ]:
            print "New entry will be added."
            return False
        else:
            print "???"
            continue

    return raw_input("New pattern: ")

def main():
    if len(sys.argv) != 4:
        print("USAGE: merge.py old_olog new_olog output")
        sys.exit(-1)

    old_olog = sys.argv[1]
    cur_olog = sys.argv[2]
    out_olog = sys.argv[3]

    try:
        old_file = open(old_olog, "r")
        old_json = json.load(old_file)
        old_file.close()
    except Exception as e:
        print("Failed to parse old olog: %s" % e)
        sys.exit(-1)

    try:
        cur_file = open(cur_olog, "r")
        cur_json = json.load(cur_file)
        cur_file.close()
    except Exception as e:
        print("Failed to parse new olog: %s" % e)
        sys.exit(-1)

    try:
        out_file = open(out_olog, "w")
    except Exception as e:
        print("Failed to open output file: %s" % e)
        sys.exit(-1)

    cur_patterns = cur_json["olog_error_warning_patterns"]
    old_patterns = old_json["olog_error_warning_patterns"]

    # Match current patterns to old definitions, detect when pattern is
    # different.

    for cp in cur_patterns:
        for op in old_patterns:
            if cp["label"] != op["label"]:
                continue

            if cp["pattern"] != op["pattern"]:
                print "Pattern update detected."
                print "Label: %s" % cp["label"]
                print ""
                print "Cur Pattern: %s" % cp["pattern"]
                print "New Pattern: %s" % op["pattern"]
                print ""

                user_pattern = get_input()

                if user_pattern == False:
                    continue

                cp["pattern"] = user_pattern

            op["found"] = True
            break

    # Take any old patterns that are no longer current and move them over

    for op in old_patterns:
        if "found" in op:
            continue

        cur_patterns.append(op)

    json.dump(cur_json, out_file, **json_params)
    out_file.close()

    print("OK")

if __name__ == "__main__":
    main()
