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

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



from typing import *
import dict_tools.differ as differ
async def present(hub, ctx, name: Text, file_system_type: Text, storage_capacity: int, subnet_ids: List, client_request_token: Text = None, storage_type: Text = None, security_group_ids: List = None, tags: List = None, kms_key_id: Text = None, windows_configuration: Dict = None, lustre_configuration: Dict = None)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Creates a new, empty Amazon FSx file system. If a file system with the specified client request token exists and
    the parameters match, CreateFileSystem returns the description of the existing file system. If a file system
    specified client request token exists and the parameters don't match, this call returns
    IncompatibleParameterError. If a file system with the specified client request token doesn't exist,
    CreateFileSystem does the following:    Creates a new, empty Amazon FSx file system with an assigned ID, and an
    initial lifecycle state of CREATING.   Returns the description of the file system.   This operation requires a
    client request token in the request that Amazon FSx uses to ensure idempotent creation. This means that calling
    the operation multiple times with the same client request token has no effect. By using the idempotent
    operation, you can retry a CreateFileSystem operation without the risk of creating an extra file system. This
    approach can be useful when an initial call fails in a way that makes it unclear whether a file system was
    created. Examples are if a transport level timeout occurred, or your connection was reset. If you use the same
    client request token and the initial call created a file system, the client receives success as long as the
    parameters are the same.  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
    returns the file system state along with other information.

    Args:
        name(Text): The name of the state.
        client_request_token(Text, optional): A string of up to 64 ASCII characters that Amazon FSx uses to ensure idempotent creation. This
            string is automatically filled on your behalf when you use the AWS Command Line Interface (AWS
            CLI) or an AWS SDK. Defaults to None.
        file_system_type(Text): The type of Amazon FSx file system to create, either WINDOWS or LUSTRE.
        storage_capacity(int): Sets the storage capacity of the file system that you're creating. For Lustre file systems:
            For SCRATCH_2 and PERSISTENT_1 SSD deployment types, valid values are 1200 GiB, 2400 GiB, and
            increments of 2400 GiB.   For PERSISTENT HDD file systems, valid values are increments of 6000
            GiB for 12 MB/s/TiB file systems and increments of 1800 GiB for 40 MB/s/TiB file systems.   For
            SCRATCH_1 deployment type, valid values are 1200 GiB, 2400 GiB, and increments of 3600 GiB.
            For Windows file systems:   If StorageType=SSD, valid values are 32 GiB - 65,536 GiB (64 TiB).
            If StorageType=HDD, valid values are 2000 GiB - 65,536 GiB (64 TiB).
        storage_type(Text, optional): Sets the storage type for the file system you're creating. Valid values are SSD and HDD.   Set
            to SSD to use solid state drive storage. SSD is supported on all Windows and Lustre deployment
            types.   Set to HDD to use hard disk drive storage. HDD is supported on SINGLE_AZ_2 and
            MULTI_AZ_1 Windows file system deployment types, and on PERSISTENT Lustre file system deployment
            types.     Default value is SSD. For more information, see  Storage Type Options in the Amazon
            FSx for Windows User Guide and Multiple Storage Options in the Amazon FSx for Lustre User Guide. Defaults to None.
        subnet_ids(List): Specifies the IDs of the subnets that the file system will be accessible from. For Windows
            MULTI_AZ_1 file system deployment types, provide exactly two subnet IDs, one for the preferred
            file server and one for the standby file server. You specify one of these subnets as the
            preferred subnet using the WindowsConfiguration > PreferredSubnetID property. For more
            information, see  Availability and durability: Single-AZ and Multi-AZ file systems. For Windows
            SINGLE_AZ_1 and SINGLE_AZ_2 file system deployment types and Lustre file systems, provide
            exactly one subnet ID. The file server is launched in that subnet's Availability Zone.
        security_group_ids(List, optional): A list of IDs specifying the security groups to apply to all network interfaces created for file
            system access. This list isn't returned in later requests to describe the file system. Defaults to None.
        tags(List, optional): The tags to apply to the file system being created. The key value of the Name tag appears in the
            console as the file system name. Defaults to None.
        kms_key_id(Text, optional): The ID of the AWS Key Management Service (AWS KMS) key used to encrypt the file system's data
            for Amazon FSx for Windows File Server file systems and Amazon FSx for Lustre PERSISTENT_1 file
            systems at rest. In either case, if not specified, the Amazon FSx managed key is used. The
            Amazon FSx for Lustre SCRATCH_1 and SCRATCH_2 file systems are always encrypted at rest using
            Amazon FSx managed keys. For more information, see Encrypt in the AWS Key Management Service API
            Reference. Defaults to None.
        windows_configuration(Dict, optional): The Microsoft Windows configuration for the file system being created. Defaults to None.
        lustre_configuration(Dict, optional): The Lustre configuration for the file system being created. Defaults to None.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

            resource_is_present:
              aws_auto.fsx.file_system.present:
                - name: value
                - file_system_type: value
                - storage_capacity: value
                - subnet_ids: value
    '''
    
    result = dict(comment="", changes= None, name=name, result=True)

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

    if before:
        result["comment"] = f"'{name}' already exists"
    else:
        try:
            ret = await hub.exec.boto3.client.fsx.create_file_system(
                ctx,
                
                
                **{"ClientRequestToken": client_request_token, "FileSystemType": file_system_type, "StorageCapacity": storage_capacity, "StorageType": storage_type, "SubnetIds": subnet_ids, "SecurityGroupIds": security_group_ids, "Tags": tags, "KmsKeyId": kms_key_id, "WindowsConfiguration": windows_configuration, "LustreConfiguration": lustre_configuration}
            )
            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.fsx.describe_file_systems(name)
    result["changes"] = differ.deep_diff(before, after)
    return result

async def absent(hub, ctx, name: Text, file_system_id: Text, client_request_token: Text = None, windows_configuration: Dict = None, lustre_configuration: Dict = None)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Deletes a file system, deleting its contents. After deletion, the file system no longer exists, and its data is
    gone. Any existing automatic backups will also be deleted. By default, when you delete an Amazon FSx for Windows
    File Server file system, a final backup is created upon deletion. This final backup is not subject to the file
    system's retention policy, and must be manually deleted. The DeleteFileSystem action returns while the file
    system has the DELETING status. You can check the file system deletion status by calling the DescribeFileSystems
    action, which returns a list of file systems in your account. If you pass the file system ID for a deleted file
    system, the DescribeFileSystems returns a FileSystemNotFound error.  Deleting an Amazon FSx for Lustre file
    system will fail with a 400 BadRequest if a data repository task is in a PENDING or EXECUTING state.   The data
    in a deleted file system is also deleted and can't be recovered by any means.

    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.
        client_request_token(Text, optional): A string of up to 64 ASCII characters that Amazon FSx uses to ensure idempotent deletion. This
            is automatically filled on your behalf when using the AWS CLI or SDK. Defaults to None.
        windows_configuration(Dict, optional): The configuration object for the Microsoft Windows file system used in the DeleteFileSystem
            operation. Defaults to None.
        lustre_configuration(Dict, optional): The configuration object for the Amazon FSx for Lustre file system being deleted in the
            DeleteFileSystem operation. Defaults to None.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

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

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

