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

hub.exec.boto3.client.cloudtrail.create_trail
hub.exec.boto3.client.cloudtrail.delete_trail
hub.exec.boto3.client.cloudtrail.describe_trails
hub.exec.boto3.client.cloudtrail.get_trail
hub.exec.boto3.client.cloudtrail.list_trails
hub.exec.boto3.client.cloudtrail.update_trail
"""



from typing import *
import dict_tools.differ as differ
async def present(hub, ctx, name: Text, s3_bucket_name: Text, s3_key_prefix: Text = None, sns_topic_name: Text = None, include_global_service_events: bool = None, is_multi_region_trail: bool = None, enable_log_file_validation: bool = None, cloud_watch_logs_log_group_arn: Text = None, cloud_watch_logs_role_arn: Text = None, kms_key_id: Text = None, is_organization_trail: bool = None, tags_list: List = None)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Creates a trail that specifies the settings for delivery of log data to an Amazon S3 bucket.

    Args:
        name(Text): Specifies the name of the trail. The name must meet the following requirements:   Contain only
            ASCII letters (a-z, A-Z), numbers (0-9), periods (.), underscores (_), or dashes (-)   Start
            with a letter or number, and end with a letter or number   Be between 3 and 128 characters
            Have no adjacent periods, underscores or dashes. Names like my-_namespace and my--namespace are
            invalid.   Not be in IP address format (for example, 192.168.5.4).
        s3_bucket_name(Text): Specifies the name of the Amazon S3 bucket designated for publishing log files. See Amazon S3
            Bucket Naming Requirements.
        s3_key_prefix(Text, optional): Specifies the Amazon S3 key prefix that comes after the name of the bucket you have designated
            for log file delivery. For more information, see Finding Your CloudTrail Log Files. The maximum
            length is 200 characters. Defaults to None.
        sns_topic_name(Text, optional): Specifies the name of the Amazon SNS topic defined for notification of log file delivery. The
            maximum length is 256 characters. Defaults to None.
        include_global_service_events(bool, optional): Specifies whether the trail is publishing events from global services such as IAM to the log
            files. Defaults to None.
        is_multi_region_trail(bool, optional): Specifies whether the trail is created in the current region or in all regions. The default is
            false, which creates a trail only in the region where you are signed in. As a best practice,
            consider creating trails that log events in all regions. Defaults to None.
        enable_log_file_validation(bool, optional): Specifies whether log file integrity validation is enabled. The default is false.  When you
            disable log file integrity validation, the chain of digest files is broken after one hour.
            CloudTrail will not create digest files for log files that were delivered during a period in
            which log file integrity validation was disabled. For example, if you enable log file integrity
            validation at noon on January 1, disable it at noon on January 2, and re-enable it at noon on
            January 10, digest files will not be created for the log files delivered from noon on January 2
            to noon on January 10. The same applies whenever you stop CloudTrail logging or delete a trail. Defaults to None.
        cloud_watch_logs_log_group_arn(Text, optional): Specifies a log group name using an Amazon Resource Name (ARN), a unique identifier that
            represents the log group to which CloudTrail logs will be delivered. Not required unless you
            specify CloudWatchLogsRoleArn. Defaults to None.
        cloud_watch_logs_role_arn(Text, optional): Specifies the role for the CloudWatch Logs endpoint to assume to write to a user's log group. Defaults to None.
        kms_key_id(Text, optional): Specifies the KMS key ID to use to encrypt the logs delivered by CloudTrail. The value can be an
            alias name prefixed by "alias/", a fully specified ARN to an alias, a fully specified ARN to a
            key, or a globally unique identifier. Examples:   alias/MyAliasName   arn:aws:kms:us-
            east-2:123456789012:alias/MyAliasName   arn:aws:kms:us-
            east-2:123456789012:key/12345678-1234-1234-1234-123456789012
            12345678-1234-1234-1234-123456789012. Defaults to None.
        is_organization_trail(bool, optional): Specifies whether the trail is created for all accounts in an organization in AWS Organizations,
            or only for the current AWS account. The default is false, and cannot be true unless the call is
            made on behalf of an AWS account that is the master account for an organization in AWS
            Organizations. Defaults to None.
        tags_list(List, optional): A list of tags. Defaults to None.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

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

    if before:
        result["comment"] = f"'{name}' already exists"
    else:
        try:
            ret = await hub.exec.boto3.client.cloudtrail.create_trail(
                ctx,
                
                
                **{"Name": name, "S3BucketName": s3_bucket_name, "S3KeyPrefix": s3_key_prefix, "SnsTopicName": sns_topic_name, "IncludeGlobalServiceEvents": include_global_service_events, "IsMultiRegionTrail": is_multi_region_trail, "EnableLogFileValidation": enable_log_file_validation, "CloudWatchLogsLogGroupArn": cloud_watch_logs_log_group_arn, "CloudWatchLogsRoleArn": cloud_watch_logs_role_arn, "KmsKeyId": kms_key_id, "IsOrganizationTrail": is_organization_trail, "TagsList": tags_list}
            )
            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.cloudtrail.describe_trails(name)
    result["changes"] = differ.deep_diff(before, after)
    return result

async def absent(hub, ctx, name: Text)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Deletes a trail. This operation must be called from the region in which the trail was created. DeleteTrail
    cannot be called on the shadow trails (replicated trails in other regions) of a trail that is enabled in all
    regions.

    Args:
        name(Text): Specifies the name or the CloudTrail ARN of the trail to be deleted. The format of a trail ARN
            is: arn:aws:cloudtrail:us-east-2:123456789012:trail/MyTrail.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

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

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

