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

hub.exec.boto3.client.ssm.create_activation
hub.exec.boto3.client.ssm.delete_activation
hub.exec.boto3.client.ssm.describe_activations
"""



from typing import *
import dict_tools.differ as differ
async def present(hub, ctx, name: Text, iam_role: Text, description: Text = None, default_instance_name: Text = None, registration_limit: int = None, expiration_date: Text = None, tags: List = None)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Generates an activation code and activation ID you can use to register your on-premises server or virtual
    machine (VM) with Amazon Web Services Systems Manager. Registering these machines with Systems Manager makes it
    possible to manage them using Systems Manager capabilities. You use the activation code and ID when installing
    SSM Agent on machines in your hybrid environment. For more information about requirements for managing on-
    premises instances and VMs using Systems Manager, see Setting up Amazon Web Services Systems Manager for hybrid
    environments in the Amazon Web Services Systems Manager User Guide.   On-premises servers or VMs that are
    registered with Systems Manager and Amazon Elastic Compute Cloud (Amazon EC2) instances that you manage with
    Systems Manager are all called managed instances.

    Args:
        name(Text): A name, ID, or JMES search path to identify the resource.
        description(Text, optional): A user-defined description of the resource that you want to register with Systems Manager.
            Don't enter personally identifiable information in this field. Defaults to None.
        default_instance_name(Text, optional): The name of the registered, managed instance as it will appear in the Amazon Web Services
            Systems Manager console or when you use the Amazon Web Services command line tools to list
            Systems Manager resources.  Don't enter personally identifiable information in this field. Defaults to None.
        iam_role(Text): The name of the Identity and Access Management (IAM) role that you want to assign to the managed
            instance. This IAM role must provide AssumeRole permissions for the Amazon Web Services Systems
            Manager service principal ssm.amazonaws.com. For more information, see Create an IAM service
            role for a hybrid environment in the Amazon Web Services Systems Manager User Guide.
        registration_limit(int, optional): Specify the maximum number of managed instances you want to register. The default value is 1. Defaults to None.
        expiration_date(Text, optional): The date by which this activation request should expire, in timestamp format, such as
            "2021-07-07T00:00:00". You can specify a date up to 30 days in advance. If you don't provide an
            expiration date, the activation code expires in 24 hours. Defaults to None.
        tags(List, optional): Optional metadata that you assign to a resource. Tags enable you to categorize a resource in
            different ways, such as by purpose, owner, or environment. For example, you might want to tag an
            activation to identify which servers or virtual machines (VMs) in your on-premises environment
            you intend to activate. In this case, you could specify the following key-value pairs:
            Key=OS,Value=Windows     Key=Environment,Value=Production     When you install SSM Agent on your
            on-premises servers and VMs, you specify an activation ID and code. When you specify the
            activation ID and code, tags assigned to the activation are automatically applied to the on-
            premises servers or VMs.  You can't add tags to or delete tags from an existing activation. You
            can tag your on-premises servers and VMs after they connect to Systems Manager for the first
            time and are assigned a managed instance ID. This means they are listed in the Amazon Web
            Services Systems Manager console with an ID that is prefixed with "mi-". For information about
            how to add tags to your managed instances, see AddTagsToResource. For information about how to
            remove tags from your managed instances, see RemoveTagsFromResource. Defaults to None.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

            resource_is_present:
              aws_auto.ssm.activation.present:
                - name: value
                - iam_role: value
    '''
    
    result = dict(comment="", changes= None, name=name, result=True)
    ret = await hub.exec.boto3.client.ssm.activation.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.ssm.describe_activations(name)

    if before:
        result["comment"] = f"'{name}' already exists"
    else:
        try:
            ret = await hub.exec.boto3.client.ssm.create_activation(
                ctx,
                
                
                **{"Description": description, "DefaultInstanceName": default_instance_name, "IamRole": iam_role, "RegistrationLimit": registration_limit, "ExpirationDate": expiration_date, "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.ssm.describe_activations(name)
    result["changes"] = differ.deep_diff(before, after)
    return result

async def absent(hub, ctx, name: Text, activation_id: Text)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Deletes an activation. You aren't required to delete an activation. If you delete an activation, you can no
    longer use it to register additional managed instances. Deleting an activation doesn't de-register managed
    instances. You must manually de-register managed instances.

    Args:
        name(Text): A name, ID, or JMES search path to identify the resource.
        activation_id(Text): The ID of the activation that you want to delete.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

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

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

