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

hub.exec.boto3.client.s3control.delete_access_point_policy
hub.exec.boto3.client.s3control.get_access_point_policy
hub.exec.boto3.client.s3control.put_access_point_policy
"""



from typing import *
import dict_tools.differ as differ
async def present(hub, ctx, name: Text, account_id: Text, policy: Text)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Associates an access policy with the specified access point. Each access point can have only one policy, so a
    request made to this API replaces any existing policy associated with 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
    PutAccessPointPolicy:    GetAccessPointPolicy     DeleteAccessPointPolicy

    Args:
        name(Text): The name of the access point that you want to associate with the specified policy. 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 owner of the bucket associated with the specified access point.
        policy(Text): The policy that you want to apply to the specified access point. For more information about
            access point policies, see Managing data access with Amazon S3 access points in the Amazon S3
            User Guide.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

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

    if before:
        result["comment"] = f"'{name}' already exists"
    else:
        try:
            ret = await hub.exec.boto3.client.s3control.put_access_point_policy(
                ctx,
                
                
                **{"Name": name, "AccountId": account_id, "Policy": policy}
            )
            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_policy(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 access point policy for 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 DeleteAccessPointPolicy:
    PutAccessPointPolicy     GetAccessPointPolicy

    Args:
        name(Text): The name of the access point whose policy 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_policy.absent:
                - name: value
                - account_id: value
    '''
    
    result = dict(comment="", changes= None, name=name, result=True)
    ret = await hub.exec.boto3.client.s3control.access_point_policy.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_policy(name)

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

