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

hub.exec.boto3.client.s3control.create_access_point
hub.exec.boto3.client.s3control.delete_access_point
hub.exec.boto3.client.s3control.get_access_point
hub.exec.boto3.client.s3control.list_access_points
"""



from typing import *
import dict_tools.differ as differ
async def present(hub, ctx, name: Text, account_id: Text, bucket: Text, vpc_configuration: Dict = None, public_access_block_configuration: Dict = None)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Creates an access point and associates it with the specified bucket. For more information, see Managing Data
    Access with Amazon S3 Access Points in the Amazon S3 User Guide.   S3 on Outposts only supports VPC-style access
    points.  For more information, see  Accessing Amazon S3 on Outposts using virtual private cloud (VPC) only
    access points in the Amazon S3 User Guide.  All Amazon S3 on Outposts REST API requests for this action require
    an additional parameter of x-amz-outpost-id to be passed with the request and an S3 on Outposts endpoint
    hostname prefix instead of s3-control. For an example of the request syntax for Amazon S3 on Outposts that uses
    the S3 on Outposts endpoint hostname prefix and the x-amz-outpost-id derived using the access point ARN, see the
    Examples section.  The following actions are related to CreateAccessPoint:    GetAccessPoint
    DeleteAccessPoint     ListAccessPoints

    Args:
        name(Text): The name you want to assign to this access point.
        account_id(Text): The account ID for the owner of the bucket for which you want to create an access point.
        bucket(Text): The name of the bucket that you want to associate this access point with. For using this
            parameter with Amazon S3 on Outposts with the REST API, you must specify the name and the x-amz-
            outpost-id as well. For using this parameter with S3 on Outposts with the Amazon Web Services
            SDK and CLI, you must specify the ARN of the bucket accessed in the format
            arn:aws:s3-outposts:<Region>:<account-id>:outpost/<outpost-id>/bucket/<my-bucket-name>. For
            example, to access the bucket reports through outpost my-outpost owned by account 123456789012
            in Region us-west-2, use the URL encoding of arn:aws:s3-outposts:us-
            west-2:123456789012:outpost/my-outpost/bucket/reports. The value must be URL encoded.
        vpc_configuration(Dict, optional): If you include this field, Amazon S3 restricts access to this access point to requests from the
            specified virtual private cloud (VPC).  This is required for creating an access point for Amazon
            S3 on Outposts buckets. Defaults to None.
        public_access_block_configuration(Dict, optional):  The PublicAccessBlock configuration that you want to apply to the access point. Defaults to None.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

            resource_is_present:
              aws_auto.s3control.access_point.present:
                - name: value
                - account_id: value
                - bucket: value
    '''
    
    result = dict(comment="", changes= None, name=name, result=True)
    ret = await hub.exec.boto3.client.s3control.access_point.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.s3control.get_access_point(name)

    if before:
        result["comment"] = f"'{name}' already exists"
    else:
        try:
            ret = await hub.exec.boto3.client.s3control.create_access_point(
                ctx,
                
                
                **{"Name": name, "AccountId": account_id, "Bucket": bucket, "VpcConfiguration": vpc_configuration, "PublicAccessBlockConfiguration": public_access_block_configuration}
            )
            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.s3control.get_access_point(name)
    result["changes"] = differ.deep_diff(before, after)
    return result

async def absent(hub, ctx, name: Text, account_id: Text)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Deletes the specified access point. All Amazon S3 on Outposts REST API requests for this action require an
    additional parameter of x-amz-outpost-id to be passed with the request and an S3 on Outposts endpoint hostname
    prefix instead of s3-control. For an example of the request syntax for Amazon S3 on Outposts that uses the S3 on
    Outposts endpoint hostname prefix and the x-amz-outpost-id derived using the access point ARN, see the Examples
    section. The following actions are related to DeleteAccessPoint:    CreateAccessPoint     GetAccessPoint
    ListAccessPoints

    Args:
        name(Text): The name of the access point you want to delete. For using this parameter with Amazon S3 on
            Outposts with the REST API, you must specify the name and the x-amz-outpost-id as well. For
            using this parameter with S3 on Outposts with the Amazon Web Services SDK and CLI, you must
            specify the ARN of the access point accessed in the format
            arn:aws:s3-outposts:<Region>:<account-id>:outpost/<outpost-id>/accesspoint/<my-accesspoint-
            name>. For example, to access the access point reports-ap through outpost my-outpost owned by
            account 123456789012 in Region us-west-2, use the URL encoding of arn:aws:s3-outposts:us-
            west-2:123456789012:outpost/my-outpost/accesspoint/reports-ap. The value must be URL encoded.
        account_id(Text): The account ID for the account that owns the specified access point.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

            resource_is_absent:
              aws_auto.s3control.access_point.absent:
                - name: value
                - account_id: value
    '''
    
    result = dict(comment="", changes= None, name=name, result=True)
    ret = await hub.exec.boto3.client.s3control.access_point.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.s3control.get_access_point(name)

    if not before:
        result["comment"] = f"'{name}' already absent"
    else:
        try:
            ret = await hub.exec.boto3.client.s3control.delete_access_point(
                ctx,
                
                
                **{"Name": name, "AccountId": account_id}
            )
            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.s3control.get_access_point(name)
    result["changes"] = differ.deep_diff(before, after)
    return result

