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

hub.exec.boto3.client.dms.create_event_subscription
hub.exec.boto3.client.dms.delete_event_subscription
hub.exec.boto3.client.dms.describe_event_subscriptions
hub.exec.boto3.client.dms.modify_event_subscription
"""



from typing import *
import dict_tools.differ as differ
async def present(hub, ctx, name: Text, subscription_name: Text, sns_topic_arn: Text, source_type: Text = None, event_categories: List = None, source_ids: List = None, enabled: bool = None, tags: List = None)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
     Creates an DMS event notification subscription.  You can specify the type of source (SourceType) you want to be
    notified of, provide a list of DMS source IDs (SourceIds) that triggers the events, and provide a list of event
    categories (EventCategories) for events you want to be notified of. If you specify both the SourceType and
    SourceIds, such as SourceType = replication-instance and SourceIdentifier = my-replinstance, you will be
    notified of all the replication instance events for the specified source. If you specify a SourceType but don't
    specify a SourceIdentifier, you receive notice of the events for that source type for all your DMS sources. If
    you don't specify either SourceType nor SourceIdentifier, you will be notified of events generated from all DMS
    sources belonging to your customer account. For more information about DMS events, see Working with Events and
    Notifications in the Database Migration Service User Guide.

    Args:
        name(Text): A name, ID, or JMES search path to identify the resource.
        subscription_name(Text): The name of the DMS event notification subscription. This name must be less than 255 characters.
        sns_topic_arn(Text):  The Amazon Resource Name (ARN) of the Amazon SNS topic created for event notification. The ARN
            is created by Amazon SNS when you create a topic and subscribe to it.
        source_type(Text, optional):  The type of DMS resource that generates the events. For example, if you want to be notified of
            events generated by a replication instance, you set this parameter to replication-instance. If
            this value isn't specified, all events are returned.  Valid values: replication-instance |
            replication-task. Defaults to None.
        event_categories(List, optional): A list of event categories for a source type that you want to subscribe to. For more
            information, see Working with Events and Notifications in the Database Migration Service User
            Guide. Defaults to None.
        source_ids(List, optional): A list of identifiers for which DMS provides notification events. If you don't specify a value,
            notifications are provided for all sources. If you specify multiple values, they must be of the
            same type. For example, if you specify a database instance ID, then all of the other values must
            be database instance IDs. Defaults to None.
        enabled(bool, optional):  A Boolean value; set to true to activate the subscription, or set to false to create the
            subscription but not activate it. Defaults to None.
        tags(List, optional): One or more tags to be assigned to the event subscription. Defaults to None.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

            resource_is_present:
              aws_auto.dms.event_subscription.present:
                - name: value
                - subscription_name: value
                - sns_topic_arn: value
    '''
    
    result = dict(comment="", changes= None, name=name, result=True)
    ret = await hub.exec.boto3.client.dms.event_subscription.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.dms.describe_event_subscriptions(name)

    if before:
        result["comment"] = f"'{name}' already exists"
    else:
        try:
            ret = await hub.exec.boto3.client.dms.create_event_subscription(
                ctx,
                
                
                **{"SubscriptionName": subscription_name, "SnsTopicArn": sns_topic_arn, "SourceType": source_type, "EventCategories": event_categories, "SourceIds": source_ids, "Enabled": enabled, "Tags": tags}
            )
            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.dms.describe_event_subscriptions(name)
    result["changes"] = differ.deep_diff(before, after)
    return result

async def absent(hub, ctx, name: Text, subscription_name: Text)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
     Deletes an DMS event subscription.

    Args:
        name(Text): A name, ID, or JMES search path to identify the resource.
        subscription_name(Text): The name of the DMS event notification subscription to be deleted.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

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

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

