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

hub.exec.boto3.client.ssm.create_resource_data_sync
hub.exec.boto3.client.ssm.delete_resource_data_sync
hub.exec.boto3.client.ssm.list_resource_data_sync
hub.exec.boto3.client.ssm.update_resource_data_sync
"""



from typing import *
import dict_tools.differ as differ
async def present(hub, ctx, name: Text, sync_name: Text, s3_destination: Dict = None, sync_type: Text = None, sync_source: Dict = None)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    A resource data sync helps you view data from multiple sources in a single location. Amazon Web Services Systems
    Manager offers two types of resource data sync: SyncToDestination and SyncFromSource. You can configure Systems
    Manager Inventory to use the SyncToDestination type to synchronize Inventory data from multiple Amazon Web
    Services Regions to a single Amazon Simple Storage Service (Amazon S3) bucket. For more information, see
    Configuring resource data sync for Inventory in the Amazon Web Services Systems Manager User Guide. You can
    configure Systems Manager Explorer to use the SyncFromSource type to synchronize operational work items
    (OpsItems) and operational data (OpsData) from multiple Amazon Web Services Regions to a single Amazon S3
    bucket. This type can synchronize OpsItems and OpsData from multiple Amazon Web Services accounts and Amazon Web
    Services Regions or EntireOrganization by using Organizations. For more information, see Setting up Systems
    Manager Explorer to display data from multiple accounts and Regions in the Amazon Web Services Systems Manager
    User Guide. A resource data sync is an asynchronous operation that returns immediately. After a successful
    initial sync is completed, the system continuously syncs data. To check the status of a sync, use the
    ListResourceDataSync.  By default, data isn't encrypted in Amazon S3. We strongly recommend that you enable
    encryption in Amazon S3 to ensure secure data storage. We also recommend that you secure access to the Amazon S3
    bucket by creating a restrictive bucket policy.

    Args:
        name(Text): A name, ID, or JMES search path to identify the resource.
        sync_name(Text): A name for the configuration.
        s3_destination(Dict, optional): Amazon S3 configuration details for the sync. This parameter is required if the SyncType value
            is SyncToDestination. Defaults to None.
        sync_type(Text, optional): Specify SyncToDestination to create a resource data sync that synchronizes data to an S3 bucket
            for Inventory. If you specify SyncToDestination, you must provide a value for S3Destination.
            Specify SyncFromSource to synchronize data from a single account and multiple Regions, or
            multiple Amazon Web Services accounts and Amazon Web Services Regions, as listed in
            Organizations for Explorer. If you specify SyncFromSource, you must provide a value for
            SyncSource. The default value is SyncToDestination. Defaults to None.
        sync_source(Dict, optional): Specify information about the data sources to synchronize. This parameter is required if the
            SyncType value is SyncFromSource. Defaults to None.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

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

    if before:
        result["comment"] = f"'{name}' already exists"
    else:
        try:
            ret = await hub.exec.boto3.client.ssm.create_resource_data_sync(
                ctx,
                
                
                **{"SyncName": sync_name, "S3Destination": s3_destination, "SyncType": sync_type, "SyncSource": sync_source}
            )
            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.list_resource_data_sync(name)
    result["changes"] = differ.deep_diff(before, after)
    return result

async def absent(hub, ctx, name: Text, sync_name: Text, sync_type: Text = None)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Deletes a resource data sync configuration. After the configuration is deleted, changes to data on managed
    instances are no longer synced to or from the target. Deleting a sync configuration doesn't delete data.

    Args:
        name(Text): A name, ID, or JMES search path to identify the resource.
        sync_name(Text): The name of the configuration to delete.
        sync_type(Text, optional): Specify the type of resource data sync to delete. Defaults to None.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

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

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

