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

import regex as re

from cfnlint.rules import CloudFormationLintRule, RuleMatch


class RefExist(CloudFormationLintRule):
    id = "E1012"
    shortdesc = "Check if Refs exist"
    description = "Making sure the refs exist"
    source_url = "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html"
    tags = ["functions", "ref"]

    def searchstring(self, string):
        """Search string for tokenized fields"""
        regex = re.compile(r"\${([a-zA-Z0-9]*)}")
        return regex.findall(string)

    def match(self, cfn):
        matches = []

        # Build the list of refs
        reftrees = cfn.search_deep_keys("Ref")
        refs = []
        for reftree in reftrees:
            refs.append(reftree[-1])

        valid_refs = cfn.get_valid_refs()

        # start with the basic ref calls
        for reftree in reftrees:
            ref = reftree[-1]
            if isinstance(ref, (str, int)):
                if ref not in valid_refs:
                    message = "Ref {0} not found as a resource or parameter"
                    matches.append(RuleMatch(reftree[:-2], message.format(ref)))

        return matches
