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

hub.exec.boto3.client.wafv2.create_rule_group
hub.exec.boto3.client.wafv2.delete_rule_group
hub.exec.boto3.client.wafv2.get_rule_group
hub.exec.boto3.client.wafv2.list_rule_groups
hub.exec.boto3.client.wafv2.update_rule_group
"""



from typing import *
import dict_tools.differ as differ
async def present(hub, ctx, name: Text, scope: Text, capacity: int, 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 RuleGroup per the specifications provided.   A rule group defines a collection of rules to inspect and
    control web requests that you can use in a WebACL. When you create a rule group, you define an immutable
    capacity limit. If you update a rule group, you must stay within the capacity. This allows others to reuse the
    rule group with confidence in its capacity requirements.

    Args:
        name(Text): The name of the rule group. You cannot change the name of a rule group 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.
        capacity(int): The web ACL capacity units (WCUs) required for this rule group. When you create your own rule
            group, you define this, and you cannot change it after creation. When you add or modify the
            rules in a rule group, WAF enforces this limit. You can check the capacity for a set of rules
            using CheckCapacity. WAF uses WCUs to calculate and control the operating resources that are
            used to run your rules, rule groups, and web ACLs. WAF calculates capacity differently for each
            rule type, to reflect the relative cost of each rule. Simple rules that cost little to run use
            fewer WCUs than more complex rules that use more processing power. Rule group capacity is fixed
            at creation, which helps users plan their web ACL WCU usage when they use a rule group. The WCU
            limit for web ACLs is 1,500.
        description(Text, optional): A description of the rule group 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 rule group, and then
            use them in the rules that you define in the rule group.  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.rule_group.present:
                - name: value
                - scope: value
                - capacity: value
                - visibility_config: value
    '''
    
    result = dict(comment="", changes= None, name=name, result=True)
    ret = await hub.exec.boto3.client.wafv2.rule_group.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_rule_group(name)

    if before:
        result["comment"] = f"'{name}' already exists"
    else:
        try:
            ret = await hub.exec.boto3.client.wafv2.create_rule_group(
                ctx,
                
                
                **{"Name": name, "Scope": scope, "Capacity": capacity, "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_rule_group(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 RuleGroup.

    Args:
        name(Text): The name of the rule group. You cannot change the name of a rule group 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): A unique identifier for the rule group. 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.rule_group.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.rule_group.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_rule_group(name)

    if not before:
        result["comment"] = f"'{name}' already absent"
    else:
        try:
            ret = await hub.exec.boto3.client.wafv2.delete_rule_group(
                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_rule_group(name)
    result["changes"] = differ.deep_diff(before, after)
    return result

