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

from cfnlint.rules import CloudFormationLintRule, RuleMatch


class CircularDependency(CloudFormationLintRule):
    """Check if Resources have a circular dependency"""

    id = "E3004"
    shortdesc = "Resource dependencies are not circular"
    description = "Check that Resources are not circularly dependent by DependsOn, Ref, Sub, or GetAtt"
    source_url = "https://github.com/aws-cloudformation/cfn-python-lint"
    tags = ["resources", "circularly", "dependson", "ref", "sub", "getatt"]

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

        if cfn.graph is None:
            return []
        for cycle in cfn.graph.get_cycles(cfn):
            source, target = cycle[:2]
            if (
                cfn.graph.graph.nodes[source].get("type") == "Resource"
                and cfn.graph.graph.nodes[target].get("type") == "Resource"
            ):
                message = f"Circular Dependencies for resource {source}. Circular dependency with [{target}]"
                path = ["Resources", source]
                matches.append(RuleMatch(path, message))

        return matches
