from collections import namedtuple
from typing import Any, Dict

from samtranslator.model.intrinsics import ref

CodeDeployLambdaAliasUpdate = namedtuple(
    "CodeDeployLambdaAliasUpdate",
    ["ApplicationName", "DeploymentGroupName", "BeforeAllowTrafficHook", "AfterAllowTrafficHook"],
)

"""
This class is a model for the update policy which becomes present on any function alias for which there is an enabled
deployment preference. Another words, if the customer specifies a deployment preference for how they want their
function aliases updated this update policy shows up to connect their lambda function alias with the correct
CodeDeploy resources.
:param ApplicationName: A reference to the name of the CodeDeploy Application (one per stack)
:param DeploymentGroupName: A reference to the name of the deployment group (in this version one per function)
:param BeforeAllowTrafficHook: A reference to the lambda function which is used to test their new version before we
    shift traffic
:param AfterAllowTrafficHook: A reference to the lambda function used for testing after we're done shifting traffic
"""


class UpdatePolicy(CodeDeployLambdaAliasUpdate):
    def to_dict(self) -> Dict[str, Dict[str, Any]]:
        """
        :return: a dict that can be used as part of a cloudformation template
        """
        dict_with_nones = self._asdict()
        codedeploy_lambda_alias_update_dict = {
            # Type ignore next line. `ref(None)` is not a typical usage of `ref()`.
            k: v
            for k, v in dict_with_nones.items()
            if v != ref(None) and v is not None  # type: ignore
        }
        return {"CodeDeployLambdaAliasUpdate": codedeploy_lambda_alias_update_dict}
