#!/usr/bin/env python3
# Copyright (c) 2021 Intel Corporation
#
# SPDX-License-Identifier: Apache-2.0

# A script to diff between two ram or rom reports generated by
# size_report. When you call call the ram_report or rom_report targets you
# end up with a json file in the build directory that can be used as input
# for this script.

# The output shows which symbols increased and which decreased in size and
# also tracked added/remove symbols as well.

# Example:
#    ./scripts/footprint/fpdiff.py ram1.json ram2.json

from anytree.importer import DictImporter
from anytree import PreOrderIter
from anytree.search  import find

from colorama import Fore
import json
import argparse

importer = DictImporter()

def parse_args():
    parser = argparse.ArgumentParser(
                description="Compare footprint sizes of two builds.")
    parser.add_argument("file1", help="First file")
    parser.add_argument("file2", help="Second file")

    return parser.parse_args()

def main():
    args = parse_args()

    with open(args.file1, "r") as f:
        data = json.load(f)
        root1 = importer.import_(data['symbols'])

    with open(args.file2, "r") as f:
        data = json.load(f)
        root2 = importer.import_(data['symbols'])

    for node in PreOrderIter(root1):
        # pylint: disable=undefined-loop-variable
        n = find(root2, lambda node2: node2.identifier == node.identifier)
        if n:
            if n.size != node.size:
                diff = n.size - node.size
                if diff == 0:
                    continue
                if not n.children or not n.parent:
                    if diff < 0:
                        print(f"{n.identifier} -> {Fore.GREEN}{diff}{Fore.RESET}")
                    else:
                        print(f"{n.identifier} -> {Fore.RED}+{diff}{Fore.RESET}")

        else:
            if not node.children:
                print(f"{node.identifier} ({Fore.GREEN}-{node.size}{Fore.RESET}) disappeared.")

    for node in PreOrderIter(root2):
        n = find(root1, lambda node2: node2.identifier == node.identifier)
        if not n:
            if not node.children and node.size != 0:
                print(f"{node.identifier} ({Fore.RED}+{node.size}{Fore.RESET}) is new.")


if __name__ == "__main__":
    main()
