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

from cfnlint.rules import CloudFormationLintRule, RuleMatch


class FargateDeploymentSchedulingStrategy(CloudFormationLintRule):
    id = "E3044"
    shortdesc = "Check Fargate service scheduling strategy"
    description = "Check that Fargate service scheduling strategy is REPLICA"
    source_url = "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-service.html#cfn-ecs-service-schedulingstrategy"
    tags = ["properties", "ecs", "service", "container", "fargate"]

    def match(self, cfn):
        matches = []
        ecs_services = cfn.get_resource_properties(["AWS::ECS::Service"])

        for ecs_service in ecs_services:
            path = ecs_service["Path"]
            properties = ecs_service["Value"]
            if isinstance(properties, dict):
                scenarios = cfn.get_object_without_conditions(
                    properties, ["LaunchType", "SchedulingStrategy"]
                )
                for scenario in scenarios:
                    props = scenario.get("Object")
                    launch_type = props.get("LaunchType", None)
                    if isinstance(launch_type, str) and launch_type == "FARGATE":
                        scheduling_strategy = props.get("SchedulingStrategy", None)
                        if (
                            isinstance(scheduling_strategy, str)
                            and scheduling_strategy != "REPLICA"
                        ):
                            error_message = f"Fargate service only support REPLICA as scheduling strategy at {'/'.join(map(str, path))}"
                            matches.append(RuleMatch(path, error_message))
        return matches
