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

hub.exec.boto3.client.s3.delete_bucket_analytics_configuration
hub.exec.boto3.client.s3.get_bucket_analytics_configuration
hub.exec.boto3.client.s3.list_bucket_analytics_configurations
hub.exec.boto3.client.s3.put_bucket_analytics_configuration
"""



from typing import *
import dict_tools.differ as differ
async def present(hub, ctx, name: Text, bucket: Text, id_: Text, analytics_configuration: Dict, expected_bucket_owner: Text = None)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Sets an analytics configuration for the bucket (specified by the analytics configuration ID). You can have up to
    1,000 analytics configurations per bucket. You can choose to have storage class analysis export analysis reports
    sent to a comma-separated values (CSV) flat file. See the DataExport request element. Reports are updated daily
    and are based on the object filters that you configure. When selecting data export, you specify a destination
    bucket and an optional destination prefix where the file is written. You can export the data to a destination
    bucket in a different account. However, the destination bucket must be in the same Region as the bucket that you
    are making the PUT analytics configuration to. For more information, see Amazon S3 Analytics – Storage Class
    Analysis.   You must create a bucket policy on the destination bucket where the exported file is written to
    grant permissions to Amazon S3 to write objects to the bucket. For an example policy, see Granting Permissions
    for Amazon S3 Inventory and Storage Class Analysis.  To use this operation, you must have permissions to perform
    the s3:PutAnalyticsConfiguration 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.  Special Errors       HTTP
    Error: HTTP 400 Bad Request     Code: InvalidArgument     Cause: Invalid argument.         HTTP Error: HTTP 400
    Bad Request     Code: TooManyConfigurations     Cause: You are attempting to create a new configuration but have
    already reached the 1,000-configuration limit.         HTTP Error: HTTP 403 Forbidden     Code: AccessDenied
    Cause: You are not the owner of the specified bucket, or you do not have the s3:PutAnalyticsConfiguration bucket
    permission to set the configuration on the bucket.       Related Resources     GetBucketAnalyticsConfiguration
    DeleteBucketAnalyticsConfiguration     ListBucketAnalyticsConfigurations

    Args:
        name(Text): A name, ID, or JMES search path to identify the resource.
        bucket(Text): The name of the bucket to which an analytics configuration is stored.
        id_(Text): The ID that identifies the analytics configuration.
        analytics_configuration(Dict): The configuration and any analyses for the analytics filter.
        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_analytics_configuration.present:
                - name: value
                - bucket: value
                - id_: value
                - analytics_configuration: value
    '''
    
    result = dict(comment="", changes= None, name=name, result=True)
    ret = await hub.exec.boto3.client.s3.bucket_analytics_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_analytics_configuration(name)

    if before:
        result["comment"] = f"'{name}' already exists"
    else:
        try:
            ret = await hub.exec.boto3.client.s3.put_bucket_analytics_configuration(
                ctx,
                
                
                **{"Bucket": bucket, "Id": id_, "AnalyticsConfiguration": analytics_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_analytics_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 an analytics configuration for the bucket (specified by the analytics configuration ID). To use this
    operation, you must have permissions to perform the s3:PutAnalyticsConfiguration 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 the Amazon S3 analytics feature, see Amazon S3 Analytics – Storage
    Class Analysis.  The following operations are related to DeleteBucketAnalyticsConfiguration:
    GetBucketAnalyticsConfiguration     ListBucketAnalyticsConfigurations     PutBucketAnalyticsConfiguration

    Args:
        name(Text): A name, ID, or JMES search path to identify the resource.
        bucket(Text): The name of the bucket from which an analytics configuration is deleted.
        id_(Text): The ID that identifies the analytics 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_analytics_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_analytics_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_analytics_configuration(name)

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

