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

hub.exec.boto3.client.iam.create_instance_profile
hub.exec.boto3.client.iam.delete_instance_profile
hub.exec.boto3.client.iam.get_instance_profile
hub.exec.boto3.client.iam.list_instance_profiles
hub.exec.boto3.client.iam.tag_instance_profile
hub.exec.boto3.client.iam.untag_instance_profile
resource = hub.tool.boto3.resource.create(ctx, "iam", "InstanceProfile", name)
hub.tool.boto3.resource.exec(resource, add_role, *args, **kwargs)
hub.tool.boto3.resource.exec(resource, delete, *args, **kwargs)
hub.tool.boto3.resource.exec(resource, remove_role, *args, **kwargs)
"""



from typing import *
import dict_tools.differ as differ
async def present(hub, ctx, name: Text, instance_profile_name: Text, path: Text = None, tags: List = None)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
     Creates a new instance profile. For information about instance profiles, see Using roles for applications on
    Amazon EC2 in the IAM User Guide, and Instance profiles in the Amazon EC2 User Guide.  For information about the
    number of instance profiles you can create, see IAM object quotas in the IAM User Guide.

    Args:
        name(Text): A name, ID, or JMES search path to identify the resource.
        instance_profile_name(Text): The name of the instance profile to create. This parameter allows (through its regex pattern) a
            string of characters consisting of upper and lowercase alphanumeric characters with no spaces.
            You can also include any of the following characters: _+=,.@-.
        path(Text, optional):  The path to the instance profile. For more information about paths, see IAM Identifiers in the
            IAM User Guide. This parameter is optional. If it is not included, it defaults to a slash (/).
            This parameter allows (through its regex pattern) a string of characters consisting of either a
            forward slash (/) by itself or a string that must begin and end with forward slashes. In
            addition, it can contain any ASCII character from the ! (\u0021) through the DEL character
            (\u007F), including most punctuation characters, digits, and upper and lowercased letters. Defaults to None.
        tags(List, optional): A list of tags that you want to attach to the newly created IAM instance profile. Each tag
            consists of a key name and an associated value. For more information about tagging, see Tagging
            IAM resources in the IAM User Guide.  If any one of the tags is invalid or if you exceed the
            allowed maximum number of tags, then the entire request fails and the resource is not created. Defaults to None.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

            resource_is_present:
              aws_auto.iam.instance_profile.present:
                - name: value
                - instance_profile_name: value
    '''
    
    result = dict(comment="", changes= None, name=name, result=True)
    ret = await hub.exec.boto3.client.iam.instance_profile.id(
        ctx,
        jmes_path=name
    )
    if ret["status"]:
        # name is now the first id that matched the JMES search path
        name = ret["ret"]
    

    resource = hub.tool.boto3.resource.create(ctx, "iam", "InstanceProfile", name)
    before = await hub.tool.boto3.resource.describe(resource)

    if before:
        result["comment"] = f"'{name}' already exists"
    else:
        try:
            ret = await hub.exec.boto3.client.iam.create_instance_profile(
                ctx,
                
                
                **{"InstanceProfileName": instance_profile_name, "Path": path, "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.tool.boto3.resource.describe(resource)
    result["changes"] = differ.deep_diff(before, after)
    return result

async def absent(hub, ctx, name: Text, instance_profile_name: Text)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Deletes the specified instance profile. The instance profile must not have an associated role.  Make sure that
    you do not have any Amazon EC2 instances running with the instance profile you are about to delete. Deleting a
    role or instance profile that is associated with a running instance will break any applications running on the
    instance.  For more information about instance profiles, see About instance profiles.

    Args:
        name(Text): A name, ID, or JMES search path to identify the resource.
        instance_profile_name(Text): The name of the instance profile to delete. This parameter allows (through its regex pattern) a
            string of characters consisting of upper and lowercase alphanumeric characters with no spaces.
            You can also include any of the following characters: _+=,.@-.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

            resource_is_absent:
              aws_auto.iam.instance_profile.absent:
                - name: value
                - instance_profile_name: value
    '''
    
    result = dict(comment="", changes= None, name=name, result=True)
    ret = await hub.exec.boto3.client.iam.instance_profile.id(
        ctx,
        jmes_path=name
    )
    if ret["status"]:
        # name is now the first id that matched the JMES search path
        name = ret["ret"]
    

    resource = hub.tool.boto3.resource.create(ctx, "iam", "InstanceProfile", name)

    before = await hub.tool.boto3.resource.describe(resource)

    if not before:
        result["comment"] = f"'{name}' already absent"
    else:
        try:
            ret = await hub.exec.boto3.client.iam.delete_instance_profile(
                ctx,
                
                
                **{"InstanceProfileName": instance_profile_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.tool.boto3.resource.describe(resource)
    result["changes"] = differ.deep_diff(before, after)
    return result

