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

hub.exec.boto3.client.iam.create_virtual_mfa_device
hub.exec.boto3.client.iam.delete_virtual_mfa_device
hub.exec.boto3.client.iam.list_virtual_mfa_devices
resource = hub.tool.boto3.resource.create(ctx, "iam", "VirtualMfaDevice", name)
hub.tool.boto3.resource.exec(resource, delete, *args, **kwargs)
"""



from typing import *
import dict_tools.differ as differ
async def present(hub, ctx, name: Text, virtual_mfa_device_name: Text, path: Text = None, tags: List = None)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Creates a new virtual MFA device for the account. After creating the virtual MFA, use EnableMFADevice to attach
    the MFA device to an IAM user. For more information about creating and working with virtual MFA devices, see
    Using a virtual MFA device in the IAM User Guide. For information about the maximum number of MFA devices you
    can create, see IAM and STS quotas in the IAM User Guide.  The seed information contained in the QR code and the
    Base32 string should be treated like any other secret access information. In other words, protect the seed
    information as you would your Amazon Web Services access keys or your passwords. After you provision your
    virtual device, you should ensure that the information is destroyed following secure procedures.

    Args:
        name(Text): A name, ID, or JMES search path to identify the resource.
        path(Text, optional):  The path for the virtual MFA device. 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.
        virtual_mfa_device_name(Text): The name of the virtual MFA device. Use with path to uniquely identify a virtual MFA device.
            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: _+=,.@-.
        tags(List, optional): A list of tags that you want to attach to the new IAM virtual MFA device. 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.virtual_mfa_device.present:
                - name: value
                - virtual_mfa_device_name: value
    '''
    
    result = dict(comment="", changes= None, name=name, result=True)
    ret = await hub.exec.boto3.client.iam.virtual_mfa_device.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", "VirtualMfaDevice", 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_virtual_mfa_device(
                ctx,
                
                
                **{"Path": path, "VirtualMFADeviceName": virtual_mfa_device_name, "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, serial_number: Text)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Deletes a virtual MFA device.   You must deactivate a user's virtual MFA device before you can delete it. For
    information about deactivating MFA devices, see DeactivateMFADevice.

    Args:
        name(Text): A name, ID, or JMES search path to identify the resource.
        serial_number(Text): The serial number that uniquely identifies the MFA device. For virtual MFA devices, the serial
            number is the same as the ARN. 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.virtual_mfa_device.absent:
                - name: value
                - serial_number: value
    '''
    
    result = dict(comment="", changes= None, name=name, result=True)
    ret = await hub.exec.boto3.client.iam.virtual_mfa_device.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", "VirtualMfaDevice", 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_virtual_mfa_device(
                ctx,
                
                
                **{"SerialNumber": serial_number}
            )
            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

