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

hub.exec.boto3.client.s3.delete_bucket_metrics_configuration
hub.exec.boto3.client.s3.get_bucket_metrics_configuration
hub.exec.boto3.client.s3.list_bucket_metrics_configurations
hub.exec.boto3.client.s3.put_bucket_metrics_configuration
"""



from typing import *
import dict_tools.differ as differ
async def present(hub, ctx, name: Text, bucket: Text, id_: Text, metrics_configuration: Dict, expected_bucket_owner: Text = None)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Sets a metrics configuration (specified by the metrics configuration ID) for the bucket. You can have up to
    1,000 metrics configurations per bucket. If you're updating an existing metrics configuration, note that this is
    a full replacement of the existing metrics configuration. If you don't include the elements you want to keep,
    they are erased. To use this operation, you must have permissions to perform the s3:PutMetricsConfiguration
    action. The bucket owner has this permission by default. The bucket owner can grant this permission to others.
    For more information about permissions, see Permissions Related to Bucket Subresource Operations and Managing
    Access Permissions to Your Amazon S3 Resources. For information about CloudWatch request metrics for Amazon S3,
    see Monitoring Metrics with Amazon CloudWatch. The following operations are related to
    PutBucketMetricsConfiguration:    DeleteBucketMetricsConfiguration     PutBucketMetricsConfiguration
    ListBucketMetricsConfigurations     GetBucketLifecycle has the following special error:   Error code:
    TooManyConfigurations    Description: You are attempting to create a new configuration but have already reached
    the 1,000-configuration limit.   HTTP Status Code: HTTP 400 Bad Request

    Args:
        name(Text): A name, ID, or JMES search path to identify the resource.
        bucket(Text): The name of the bucket for which the metrics configuration is set.
        id_(Text): The ID used to identify the metrics configuration.
        metrics_configuration(Dict): Specifies the metrics configuration.
        expected_bucket_owner(Text, optional): The account ID of the expected bucket owner. If the bucket is owned by a different account, the
            request will fail with an HTTP 403 (Access Denied) error. Defaults to None.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

            resource_is_present:
              aws_auto.s3.bucket_metrics_configuration.present:
                - name: value
                - bucket: value
                - id_: value
                - metrics_configuration: value
    '''
    
    result = dict(comment="", changes= None, name=name, result=True)
    ret = await hub.exec.boto3.client.s3.bucket_metrics_configuration.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.s3.get_bucket_metrics_configuration(name)

    if before:
        result["comment"] = f"'{name}' already exists"
    else:
        try:
            ret = await hub.exec.boto3.client.s3.put_bucket_metrics_configuration(
                ctx,
                
                
                **{"Bucket": bucket, "Id": id_, "MetricsConfiguration": metrics_configuration, "ExpectedBucketOwner": expected_bucket_owner}
            )
            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.s3.get_bucket_metrics_configuration(name)
    result["changes"] = differ.deep_diff(before, after)
    return result

async def absent(hub, ctx, name: Text, bucket: Text, id_: Text, expected_bucket_owner: Text = None)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Deletes a metrics configuration for the Amazon CloudWatch request metrics (specified by the metrics
    configuration ID) from the bucket. Note that this doesn't include the daily storage metrics.  To use this
    operation, you must have permissions to perform the s3:PutMetricsConfiguration action. The bucket owner has this
    permission by default. The bucket owner can grant this permission to others. For more information about
    permissions, see Permissions Related to Bucket Subresource Operations and Managing Access Permissions to Your
    Amazon S3 Resources. For information about CloudWatch request metrics for Amazon S3, see Monitoring Metrics with
    Amazon CloudWatch.  The following operations are related to DeleteBucketMetricsConfiguration:
    GetBucketMetricsConfiguration     PutBucketMetricsConfiguration     ListBucketMetricsConfigurations
    Monitoring Metrics with Amazon CloudWatch

    Args:
        name(Text): A name, ID, or JMES search path to identify the resource.
        bucket(Text): The name of the bucket containing the metrics configuration to delete.
        id_(Text): The ID used to identify the metrics configuration.
        expected_bucket_owner(Text, optional): The account ID of the expected bucket owner. If the bucket is owned by a different account, the
            request will fail with an HTTP 403 (Access Denied) error. Defaults to None.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

            resource_is_absent:
              aws_auto.s3.bucket_metrics_configuration.absent:
                - name: value
                - bucket: value
                - id_: value
    '''
    
    result = dict(comment="", changes= None, name=name, result=True)
    ret = await hub.exec.boto3.client.s3.bucket_metrics_configuration.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.s3.get_bucket_metrics_configuration(name)

    if not before:
        result["comment"] = f"'{name}' already absent"
    else:
        try:
            ret = await hub.exec.boto3.client.s3.delete_bucket_metrics_configuration(
                ctx,
                
                
                **{"Bucket": bucket, "Id": id_, "ExpectedBucketOwner": expected_bucket_owner}
            )
            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.s3.get_bucket_metrics_configuration(name)
    result["changes"] = differ.deep_diff(before, after)
    return result

