#!/usr/bin/env python3
#  SPDX-FileCopyrightText:  Copyright 2022-2023 Arm Limited and/or its affiliates <open-source-office@arm.com>
#  SPDX-License-Identifier: Apache-2.0
#
#  Licensed under the Apache License, Version 2.0 (the "License");
#  you may not use this file except in compliance with the License.
#  You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing, software
#  distributed under the License is distributed on an "AS IS" BASIS,
#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#  See the License for the specific language governing permissions and
#  limitations under the License.
"""
Contains methods to check if the downloaded resources need to be refreshed
"""
import hashlib
import json
import sys
import typing
from argparse import ArgumentParser
from pathlib import Path


def get_md5sum_for_file(
        filepath: typing.Union[str, Path]
) -> str:
    """
    Function to calculate md5sum for contents of a given file.

    Parameters:
    ----------
    filepath (string):  Path to the required file.

    Returns:
    -------
    Hex digest represented as string.
    """
    md5_sum = hashlib.md5()
    with open(filepath, mode='rb') as f:
        buf = f.read()
        md5_sum.update(buf)
    return md5_sum.hexdigest()


def check_update_resources_downloaded(
        resource_downloaded_dir: str, set_up_script_path: str
):
    """
    Function that check if the resources downloaded need to be refreshed.

    Parameters:
    ----------
    resource_downloaded_dir (string):  Specifies the path to resources_downloaded folder.
    set_up_script_path (string):       Specifies the path to set_up_default_resources.py file.
    """

    metadata_file_path = Path(resource_downloaded_dir) / "resources_downloaded_metadata.json"

    if metadata_file_path.is_file():
        with open(metadata_file_path, encoding="utf8") as metadata_json:
            metadata_dict = json.load(metadata_json)

        md5_key = 'set_up_script_md5sum'
        set_up_script_md5sum_metadata = ''

        if md5_key in metadata_dict.keys():
            set_up_script_md5sum_metadata = metadata_dict["set_up_script_md5sum"]

        set_up_script_md5sum_current = get_md5sum_for_file(set_up_script_path)

        if set_up_script_md5sum_current == set_up_script_md5sum_metadata:
            return 0

        # Return code 1 if the resources need to be refreshed.
        print('Error: hash mismatch!')
        print(f'Metadata: {set_up_script_md5sum_metadata}')
        print(f'Current : {set_up_script_md5sum_current}')
        return 1

    # Return error code 2 if the file doesn't exist.
    print(f'Error: could not find {metadata_file_path}')
    return 2


if __name__ == "__main__":
    parser = ArgumentParser()
    parser.add_argument(
        "--resource_downloaded_dir",
        help="Resources downloaded directory.",
        type=str,
        required=True)
    parser.add_argument(
        "--setup_script_path",
        help="Path to set_up_default_resources.py.",
        type=str,
        required=True)
    args = parser.parse_args()

    # Check validity of script path.
    if not Path(args.setup_script_path).is_file():
        raise ValueError(f'Invalid script path: {args.setup_script_path}')

    # Check the resources are downloaded as expected
    STATUS = check_update_resources_downloaded(
        args.resource_downloaded_dir,
        args.setup_script_path
    )
    sys.exit(STATUS)
