"""
Autogenerated state module using `pop-create-idem <https://gitlab.com/saltstack/pop/pop-create-idem>`__

hub.exec.boto3.client.wafv2.associate_web_acl
hub.exec.boto3.client.wafv2.create_web_acl
hub.exec.boto3.client.wafv2.delete_web_acl
hub.exec.boto3.client.wafv2.disassociate_web_acl
hub.exec.boto3.client.wafv2.get_web_acl
hub.exec.boto3.client.wafv2.list_web_acls
hub.exec.boto3.client.wafv2.update_web_acl
"""



from typing import *
import dict_tools.differ as differ
async def present(hub, ctx, name: Text, scope: Text, default_action: Dict, visibility_config: Dict, description: Text = None, rules: List = None, tags: List = None, custom_response_bodies: Dict = None)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Creates a WebACL per the specifications provided.  A web ACL defines a collection of rules to use to inspect and
    control web requests. Each rule has an action defined (allow, block, or count) for requests that match the
    statement of the rule. In the web ACL, you assign a default action to take (allow, block) for any request that
    does not match any of the rules. The rules in a web ACL can be a combination of the types Rule, RuleGroup, and
    managed rule group. You can associate a web ACL with one or more Amazon Web Services resources to protect. The
    resources can be an Amazon CloudFront distribution, an Amazon API Gateway REST API, an Application Load
    Balancer, or an AppSync GraphQL API.

    Args:
        name(Text): The name of the web ACL. You cannot change the name of a web ACL after you create it.
        scope(Text): Specifies whether this is for an Amazon CloudFront distribution or for a regional application. A
            regional application can be an Application Load Balancer (ALB), an Amazon API Gateway REST API,
            or an AppSync GraphQL API.  To work with CloudFront, you must also specify the Region US East
            (N. Virginia) as follows:    CLI - Specify the Region when you use the CloudFront scope:
            --scope=CLOUDFRONT --region=us-east-1.    API and SDKs - For all calls, use the Region endpoint
            us-east-1.
        default_action(Dict): The action to perform if none of the Rules contained in the WebACL match.
        description(Text, optional): A description of the web ACL that helps with identification. Defaults to None.
        rules(List, optional): The Rule statements used to identify the web requests that you want to allow, block, or count.
            Each rule includes one top-level statement that WAF uses to identify matching web requests, and
            parameters that govern how WAF handles them. Defaults to None.
        visibility_config(Dict): Defines and enables Amazon CloudWatch metrics and web request sample collection.
        tags(List, optional): An array of key:value pairs to associate with the resource. Defaults to None.
        custom_response_bodies(Dict, optional): A map of custom response keys and content bodies. When you create a rule with a block action,
            you can send a custom response to the web request. You define these for the web ACL, and then
            use them in the rules and default actions that you define in the web ACL.  For information about
            customizing web requests and responses, see Customizing web requests and responses in WAF in the
            WAF Developer Guide.  For information about the limits on count and size for custom request and
            response settings, see WAF quotas in the WAF Developer Guide. Defaults to None.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

            resource_is_present:
              aws_auto.wafv2.web_acl.present:
                - name: value
                - scope: value
                - default_action: value
                - visibility_config: value
    '''
    
    result = dict(comment="", changes= None, name=name, result=True)
    ret = await hub.exec.boto3.client.wafv2.web_acl.id(
        ctx,
        jmes_path=name
    )
    if ret["status"]:
        # name is now the first id that matched the JMES search path
        name = ret["ret"]
    

    
    before = await hub.exec.boto3.client.wafv2.get_web_acl(name)

    if before:
        result["comment"] = f"'{name}' already exists"
    else:
        try:
            ret = await hub.exec.boto3.client.wafv2.create_web_acl(
                ctx,
                
                
                **{"Name": name, "Scope": scope, "DefaultAction": default_action, "Description": description, "Rules": rules, "VisibilityConfig": visibility_config, "Tags": tags, "CustomResponseBodies": custom_response_bodies}
            )
            result["result"] = ret["status"]
            if not result["result"]:
                result["comment"] = ret["comment"]
                return result
            ret["comment"] = f"Created '{name}'"
        except hub.tool.boto3.exception.ClientError as e:
            result["comment"] = f"{e.__class__.__name__}: {e}"

    
    # TODO perform other modifications as needed here
    ...

    after = await hub.exec.boto3.client.wafv2.get_web_acl(name)
    result["changes"] = differ.deep_diff(before, after)
    return result

async def absent(hub, ctx, name: Text, scope: Text, id_: Text, lock_token: Text)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Deletes the specified WebACL. You can only use this if ManagedByFirewallManager is false in the specified
    WebACL.

    Args:
        name(Text): The name of the web ACL. You cannot change the name of a web ACL after you create it.
        scope(Text): Specifies whether this is for an Amazon CloudFront distribution or for a regional application. A
            regional application can be an Application Load Balancer (ALB), an Amazon API Gateway REST API,
            or an AppSync GraphQL API.  To work with CloudFront, you must also specify the Region US East
            (N. Virginia) as follows:    CLI - Specify the Region when you use the CloudFront scope:
            --scope=CLOUDFRONT --region=us-east-1.    API and SDKs - For all calls, use the Region endpoint
            us-east-1.
        id_(Text): The unique identifier for the web ACL. This ID is returned in the responses to create and list
            commands. You provide it to operations like update and delete.
        lock_token(Text): A token used for optimistic locking. WAF returns a token to your get and list requests, to mark
            the state of the entity at the time of the request. To make changes to the entity associated
            with the token, you provide the token to operations like update and delete. WAF uses the token
            to ensure that no changes have been made to the entity since you last retrieved it. If a change
            has been made, the update fails with a WAFOptimisticLockException. If this happens, perform
            another get, and use the new token returned by that operation.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

            resource_is_absent:
              aws_auto.wafv2.web_acl.absent:
                - name: value
                - scope: value
                - id_: value
                - lock_token: value
    '''
    
    result = dict(comment="", changes= None, name=name, result=True)
    ret = await hub.exec.boto3.client.wafv2.web_acl.id(
        ctx,
        jmes_path=name
    )
    if ret["status"]:
        # name is now the first id that matched the JMES search path
        name = ret["ret"]
    

    

    before = await hub.exec.boto3.client.wafv2.get_web_acl(name)

    if not before:
        result["comment"] = f"'{name}' already absent"
    else:
        try:
            ret = await hub.exec.boto3.client.wafv2.delete_web_acl(
                ctx,
                
                
                **{"Name": name, "Scope": scope, "Id": id_, "LockToken": lock_token}
            )
            result["result"] = ret["status"]
            if not result["result"]:
                result["comment"] = ret["comment"]
                return result
            result["comment"] = f"Deleted '{name}'"
        except hub.tool.boto3.exception.ClientError as e:
            result["comment"] = f"{e.__class__.__name__}: {e}"

    

    after = await hub.exec.boto3.client.wafv2.get_web_acl(name)
    result["changes"] = differ.deep_diff(before, after)
    return result

