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