#!/usr/bin/env vpython3
# -*- coding: UTF-8 -*-
#
# Copyright 2021 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""
Asserts that expected and generated list of GRD files is equal.
"""

import sys
import json


def main(argv):
    expected_grd_sources = open(argv[1], 'r').read()
    generated_grd_sources = open(argv[2], 'r').read()
    stamp_file = argv[3]

    expected_json = json.loads(expected_grd_sources)
    generated_json = json.loads(generated_grd_sources)

    expected_json.sort()
    generated_json.sort()

    return_code = 0

    for expected_file in expected_json:
        if expected_file not in generated_json:
            print(
                "File " + expected_file +
                " is not generated by any action in front_end." +
                " Either remove it from config/gni/devtools_grd_files.gni" +
                " or add the missing file to an action" +
                " (for example a devtools_module or devtools_entrypoint definition).\n"
            )

            return_code = 1

    for generated_file in generated_json:
        if generated_file not in expected_json:
            print(
                "File " + generated_file +
                " is not listed in config/gni/devtools_grd_files.gni." +
                " Either add the file to the grd_files_release_sources/grd_files_debug_sources,"
                + " or remove the generated file from an action.\n")

            return_code = 1

    with open(stamp_file, 'w', encoding="utf8") as fp:
        fp.write("")

    return return_code


if __name__ == '__main__':
    sys.exit(main(sys.argv))
