"""
Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
SPDX-License-Identifier: MIT-0
"""

from datetime import datetime

from cfnlint.data import AdditionalSpecs
from cfnlint.helpers import load_resource
from cfnlint.rules import CloudFormationLintRule


class DeprecatedRuntime(CloudFormationLintRule):
    """Check if EOL Lambda Function Runtimes are used"""

    def __init__(self):
        """Init"""
        super().__init__()
        self.resource_property_types.append("AWS::Lambda::Function")
        self.deprecated_runtimes = load_resource(
            AdditionalSpecs, "LmbdRuntimeLifecycle.json"
        )

    current_date = datetime.today()

    def check_runtime(self, runtime_value, path):
        """Check if the given runtime is valid"""
        self.logger.debug(runtime_value, path)
        return []

    def check_value(self, value, path):
        """Check Lambda Runtime value"""
        matches = []
        matches.extend(self.check_runtime(value, path))
        return matches

    def check_ref(self, value, path, parameters, resources):  # pylint: disable=W0613
        """Check Lambda Runtime Ref value"""
        matches = []
        if value in parameters:
            parameter = parameters.get(value, {})
            param_path = ["Parameters", value]

            # Validate the Default
            default_value = parameter.get("Default", "")
            matches.extend(self.check_runtime(default_value, param_path + ["Default"]))

            # Validate AllowedValues
            allowed_values = parameter.get("AllowedValues")
            if isinstance(allowed_values, list):
                param_path = param_path + ["AllowedValues"]
                for index, allowed_value in enumerate(allowed_values):
                    matches.extend(
                        self.check_runtime(allowed_value, param_path + [index])
                    )

        return matches

    def match_resource_properties(self, properties, _, path, cfn):
        """Check CloudFormation Properties"""
        matches = []

        matches.extend(
            cfn.check_value(
                obj=properties,
                key="Runtime",
                path=path[:],
                check_value=self.check_value,
                check_ref=self.check_ref,
            )
        )

        return matches
