#!/usr/bin/env vpython
# -*- 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))
