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

hub.exec.boto3.client.efs.create_file_system
hub.exec.boto3.client.efs.delete_file_system
hub.exec.boto3.client.efs.describe_file_systems
hub.exec.boto3.client.efs.update_file_system
"""



from typing import *
import dict_tools.differ as differ
async def present(hub, ctx, name: Text, creation_token: Text, performance_mode: Text = None, encrypted: bool = None, kms_key_id: Text = None, throughput_mode: Text = None, provisioned_throughput_in_mibps: float = None, availability_zone_name: Text = None, backup: bool = None, tags: List = None)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Creates a new, empty file system. The operation requires a creation token in the request that Amazon EFS uses to
    ensure idempotent creation (calling the operation with same creation token has no effect). If a file system does
    not currently exist that is owned by the caller's AWS account with the specified creation token, this operation
    does the following:   Creates a new, empty file system. The file system will have an Amazon EFS assigned ID, and
    an initial lifecycle state creating.   Returns with the description of the created file system.   Otherwise,
    this operation returns a FileSystemAlreadyExists error with the ID of the existing file system.  For basic use
    cases, you can use a randomly generated UUID for the creation token.   The idempotent operation allows you to
    retry a CreateFileSystem call without risk of creating an extra file system. This can happen when an initial
    call fails in a way that leaves it uncertain whether or not a file system was actually created. An example might
    be that a transport level timeout occurred or your connection was reset. As long as you use the same creation
    token, if the initial call had succeeded in creating a file system, the client can learn of its existence from
    the FileSystemAlreadyExists error. For more information, see Creating a file system in the Amazon EFS User
    Guide.  The CreateFileSystem call returns while the file system's lifecycle state is still creating. You can
    check the file system creation status by calling the DescribeFileSystems operation, which among other things
    returns the file system state.  This operation accepts an optional PerformanceMode parameter that you choose for
    your file system. We recommend generalPurpose performance mode for most file systems. File systems using the
    maxIO performance mode can scale to higher levels of aggregate throughput and operations per second with a
    tradeoff of slightly higher latencies for most file operations. The performance mode can't be changed after the
    file system has been created. For more information, see Amazon EFS performance modes. You can set the throughput
    mode for the file system using the ThroughputMode parameter. After the file system is fully created, Amazon EFS
    sets its lifecycle state to available, at which point you can create one or more mount targets for the file
    system in your VPC. For more information, see CreateMountTarget. You mount your Amazon EFS file system on an EC2
    instances in your VPC by using the mount target. For more information, see Amazon EFS: How it Works.   This
    operation requires permissions for the elasticfilesystem:CreateFileSystem action.

    Args:
        name(Text): The name of the state.
        creation_token(Text): A string of up to 64 ASCII characters. Amazon EFS uses this to ensure idempotent creation.
        performance_mode(Text, optional): The performance mode of the file system. We recommend generalPurpose performance mode for most
            file systems. File systems using the maxIO performance mode can scale to higher levels of
            aggregate throughput and operations per second with a tradeoff of slightly higher latencies for
            most file operations. The performance mode can't be changed after the file system has been
            created.  The maxIO mode is not supported on file systems using One Zone storage classes. Defaults to None.
        encrypted(bool, optional): A Boolean value that, if true, creates an encrypted file system. When creating an encrypted file
            system, you have the option of specifying CreateFileSystemRequest$KmsKeyId for an existing AWS
            Key Management Service (AWS KMS) customer master key (CMK). If you don't specify a CMK, then the
            default CMK for Amazon EFS, /aws/elasticfilesystem, is used to protect the encrypted file
            system. Defaults to None.
        kms_key_id(Text, optional): The ID of the AWS KMS CMK that you want to use to protect the encrypted file system. This
            parameter is only required if you want to use a non-default KMS key. If this parameter is not
            specified, the default CMK for Amazon EFS is used. This ID can be in one of the following
            formats:   Key ID - A unique identifier of the key, for example
            1234abcd-12ab-34cd-56ef-1234567890ab.   ARN - An Amazon Resource Name (ARN) for the key, for
            example arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab.   Key alias
            - A previously created display name for a key, for example alias/projectKey1.   Key alias ARN -
            An ARN for a key alias, for example arn:aws:kms:us-west-2:444455556666:alias/projectKey1.   If
            KmsKeyId is specified, the CreateFileSystemRequest$Encrypted parameter must be set to true.  EFS
            accepts only symmetric KMS keys. You cannot use asymmetric KMS keys with EFS file systems. Defaults to None.
        throughput_mode(Text, optional): Specifies the throughput mode for the file system, either bursting or provisioned. If you set
            ThroughputMode to provisioned, you must also set a value for ProvisionedThroughputInMibps. After
            you create the file system, you can decrease your file system's throughput in Provisioned
            Throughput mode or change between the throughput modes, as long as it’s been more than 24 hours
            since the last decrease or throughput mode change. For more information, see Specifying
            throughput with provisioned mode in the Amazon EFS User Guide.  Default is bursting. Defaults to None.
        provisioned_throughput_in_mibps(float, optional): The throughput, measured in MiB/s, that you want to provision for a file system that you're
            creating. Valid values are 1-1024. Required if ThroughputMode is set to provisioned. The upper
            limit for throughput is 1024 MiB/s. To increase this limit, contact AWS Support. For more
            information, see Amazon EFS quotas that you can increase in the Amazon EFS User Guide. Defaults to None.
        availability_zone_name(Text, optional): Used to create a file system that uses One Zone storage classes. It specifies the AWS
            Availability Zone in which to create the file system. Use the format us-east-1a to specify the
            Availability Zone. For more information about One Zone storage classes, see Using EFS storage
            classes in the Amazon EFS User Guide.  One Zone storage classes are not available in all
            Availability Zones in AWS Regions where Amazon EFS is available. Defaults to None.
        backup(bool, optional): Specifies whether automatic backups are enabled on the file system that you are creating. Set
            the value to true to enable automatic backups. If you are creating a file system that uses One
            Zone storage classes, automatic backups are enabled by default. For more information, see
            Automatic backups in the Amazon EFS User Guide. Default is false. However, if you specify an
            AvailabilityZoneName, the default is true.  AWS Backup is not available in all AWS Regions where
            Amazon EFS is available. Defaults to None.
        tags(List, optional): A value that specifies to create one or more tags associated with the file system. Each tag is a
            user-defined key-value pair. Name your file system on creation by including a
            "Key":"Name","Value":"{value}" key-value pair. Defaults to None.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

            resource_is_present:
              aws_auto.efs.file_system.present:
                - name: value
                - creation_token: value
    '''
    
    result = dict(comment="", changes= None, name=name, result=True)

    
    before = await hub.exec.boto3.client.efs.describe_file_systems(name)

    if before:
        result["comment"] = f"'{name}' already exists"
    else:
        try:
            ret = await hub.exec.boto3.client.efs.create_file_system(
                ctx,
                
                
                **{"CreationToken": creation_token, "PerformanceMode": performance_mode, "Encrypted": encrypted, "KmsKeyId": kms_key_id, "ThroughputMode": throughput_mode, "ProvisionedThroughputInMibps": provisioned_throughput_in_mibps, "AvailabilityZoneName": availability_zone_name, "Backup": backup, "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.efs.describe_file_systems(name)
    result["changes"] = differ.deep_diff(before, after)
    return result

async def absent(hub, ctx, name: Text, file_system_id: Text)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Deletes a file system, permanently severing access to its contents. Upon return, the file system no longer
    exists and you can't access any contents of the deleted file system.  You can't delete a file system that is in
    use. That is, if the file system has any mount targets, you must first delete them. For more information, see
    DescribeMountTargets and DeleteMountTarget.   The DeleteFileSystem call returns while the file system state is
    still deleting. You can check the file system deletion status by calling the DescribeFileSystems operation,
    which returns a list of file systems in your account. If you pass file system ID or creation token for the
    deleted file system, the DescribeFileSystems returns a 404 FileSystemNotFound error.  This operation requires
    permissions for the elasticfilesystem:DeleteFileSystem action.

    Args:
        name(Text): A name, ID, or JMES search path to identify the resource.
        file_system_id(Text): The ID of the file system you want to delete.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

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

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

