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

hub.exec.boto3.client.gamelift.create_vpc_peering_connection
hub.exec.boto3.client.gamelift.delete_vpc_peering_connection
hub.exec.boto3.client.gamelift.describe_vpc_peering_connections
"""



from typing import *
import dict_tools.differ as differ
async def present(hub, ctx, name: Text, fleet_id: Text, peer_vpc_aws_account_id: Text, peer_vpc_id: Text)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Establishes a VPC peering connection between a virtual private cloud (VPC) in an AWS account with the VPC for
    your Amazon GameLift fleet. VPC peering enables the game servers on your fleet to communicate directly with
    other AWS resources. You can peer with VPCs in any AWS account that you have access to, including the account
    that you use to manage your Amazon GameLift fleets. You cannot peer with VPCs that are in different Regions. For
    more information, see VPC Peering with Amazon GameLift Fleets. Before calling this operation to establish the
    peering connection, you first need to call CreateVpcPeeringAuthorization and identify the VPC you want to peer
    with. Once the authorization for the specified VPC is issued, you have 24 hours to establish the connection.
    These two operations handle all tasks necessary to peer the two VPCs, including acceptance, updating routing
    tables, etc.  To establish the connection, call this operation from the AWS account that is used to manage the
    Amazon GameLift fleets. Identify the following values: (1) The ID of the fleet you want to be enable a VPC
    peering connection for; (2) The AWS account with the VPC that you want to peer with; and (3) The ID of the VPC
    you want to peer with. This operation is asynchronous. If successful, a VpcPeeringConnection request is created.
    You can use continuous polling to track the request's status using DescribeVpcPeeringConnections, or by
    monitoring fleet events for success or failure using DescribeFleetEvents.   Related actions
    CreateVpcPeeringAuthorization | DescribeVpcPeeringAuthorizations | DeleteVpcPeeringAuthorization |
    CreateVpcPeeringConnection | DescribeVpcPeeringConnections | DeleteVpcPeeringConnection | All APIs by task

    Args:
        name(Text): A name, ID, or JMES search path to identify the resource.
        fleet_id(Text): A unique identifier for the fleet. You can use either the fleet ID or ARN value. This tells
            Amazon GameLift which GameLift VPC to peer with.
        peer_vpc_aws_account_id(Text): A unique identifier for the AWS account with the VPC that you want to peer your Amazon GameLift
            fleet with. You can find your Account ID in the AWS Management Console under account settings.
        peer_vpc_id(Text): A unique identifier for a VPC with resources to be accessed by your GameLift fleet. The VPC must
            be in the same Region as your fleet. To look up a VPC ID, use the VPC Dashboard in the AWS
            Management Console. Learn more about VPC peering in VPC Peering with GameLift Fleets.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

            resource_is_present:
              aws_auto.gamelift.vpc_peering_connection.present:
                - name: value
                - fleet_id: value
                - peer_vpc_aws_account_id: value
                - peer_vpc_id: value
    '''
    
    result = dict(comment="", changes= None, name=name, result=True)
    ret = await hub.exec.boto3.client.gamelift.vpc_peering_connection.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.gamelift.describe_vpc_peering_connections(name)

    if before:
        result["comment"] = f"'{name}' already exists"
    else:
        try:
            ret = await hub.exec.boto3.client.gamelift.create_vpc_peering_connection(
                ctx,
                
                
                **{"FleetId": fleet_id, "PeerVpcAwsAccountId": peer_vpc_aws_account_id, "PeerVpcId": peer_vpc_id}
            )
            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.gamelift.describe_vpc_peering_connections(name)
    result["changes"] = differ.deep_diff(before, after)
    return result

async def absent(hub, ctx, name: Text, fleet_id: Text, vpc_peering_connection_id: Text)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Removes a VPC peering connection. To delete the connection, you must have a valid authorization for the VPC
    peering connection that you want to delete. You can check for an authorization by calling
    DescribeVpcPeeringAuthorizations or request a new one using CreateVpcPeeringAuthorization.  Once a valid
    authorization exists, call this operation from the AWS account that is used to manage the Amazon GameLift
    fleets. Identify the connection to delete by the connection ID and fleet ID. If successful, the connection is
    removed.   Related actions   CreateVpcPeeringAuthorization | DescribeVpcPeeringAuthorizations |
    DeleteVpcPeeringAuthorization | CreateVpcPeeringConnection | DescribeVpcPeeringConnections |
    DeleteVpcPeeringConnection | All APIs by task

    Args:
        name(Text): A name, ID, or JMES search path to identify the resource.
        fleet_id(Text): A unique identifier for the fleet. This fleet specified must match the fleet referenced in the
            VPC peering connection record. You can use either the fleet ID or ARN value.
        vpc_peering_connection_id(Text): A unique identifier for a VPC peering connection. This value is included in the
            VpcPeeringConnection object, which can be retrieved by calling DescribeVpcPeeringConnections.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

            resource_is_absent:
              aws_auto.gamelift.vpc_peering_connection.absent:
                - name: value
                - fleet_id: value
                - vpc_peering_connection_id: value
    '''
    
    result = dict(comment="", changes= None, name=name, result=True)
    ret = await hub.exec.boto3.client.gamelift.vpc_peering_connection.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.gamelift.describe_vpc_peering_connections(name)

    if not before:
        result["comment"] = f"'{name}' already absent"
    else:
        try:
            ret = await hub.exec.boto3.client.gamelift.delete_vpc_peering_connection(
                ctx,
                
                
                **{"FleetId": fleet_id, "VpcPeeringConnectionId": vpc_peering_connection_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.gamelift.describe_vpc_peering_connections(name)
    result["changes"] = differ.deep_diff(before, after)
    return result

