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

hub.exec.boto3.client.synthetics.create_canary
hub.exec.boto3.client.synthetics.delete_canary
hub.exec.boto3.client.synthetics.describe_canaries
hub.exec.boto3.client.synthetics.get_canary
hub.exec.boto3.client.synthetics.start_canary
hub.exec.boto3.client.synthetics.stop_canary
hub.exec.boto3.client.synthetics.update_canary
"""



from typing import *
import dict_tools.differ as differ
async def present(hub, ctx, name: Text, code: Dict, artifact_s3_location: Text, execution_role_arn: Text, schedule: Dict, runtime_version: Text, run_config: Dict = None, success_retention_period_in_days: int = None, failure_retention_period_in_days: int = None, vpc_config: Dict = None, tags: Dict = None)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Creates a canary. Canaries are scripts that monitor your endpoints and APIs from the outside-in. Canaries help
    you check the availability and latency of your web services and troubleshoot anomalies by investigating load
    time data, screenshots of the UI, logs, and metrics. You can set up a canary to run continuously or just once.
    Do not use CreateCanary to modify an existing canary. Use UpdateCanary instead. To create canaries, you must
    have the CloudWatchSyntheticsFullAccess policy. If you are creating a new IAM role for the canary, you also need
    the the iam:CreateRole, iam:CreatePolicy and iam:AttachRolePolicy permissions. For more information, see
    Necessary Roles and Permissions. Do not include secrets or proprietary information in your canary names. The
    canary name makes up part of the Amazon Resource Name (ARN) for the canary, and the ARN is included in outbound
    calls over the internet. For more information, see Security Considerations for Synthetics Canaries.

    Args:
        name(Text): The name for this canary. Be sure to give it a descriptive name that distinguishes it from other
            canaries in your account. Do not include secrets or proprietary information in your canary
            names. The canary name makes up part of the canary ARN, and the ARN is included in outbound
            calls over the internet. For more information, see Security Considerations for Synthetics
            Canaries.
        code(Dict): A structure that includes the entry point from which the canary should start running your
            script. If the script is stored in an S3 bucket, the bucket name, key, and version are also
            included.
        artifact_s3_location(Text): The location in Amazon S3 where Synthetics stores artifacts from the test runs of this canary.
            Artifacts include the log file, screenshots, and HAR files. The name of the S3 bucket can't
            include a period (.).
        execution_role_arn(Text): The ARN of the IAM role to be used to run the canary. This role must already exist, and must
            include lambda.amazonaws.com as a principal in the trust policy. The role must also have the
            following permissions:    s3:PutObject     s3:GetBucketLocation     s3:ListAllMyBuckets
            cloudwatch:PutMetricData     logs:CreateLogGroup     logs:CreateLogStream     logs:PutLogEvents.
        schedule(Dict): A structure that contains information about how often the canary is to run and when these test
            runs are to stop.
        run_config(Dict, optional): A structure that contains the configuration for individual canary runs, such as timeout value. Defaults to None.
        success_retention_period_in_days(int, optional): The number of days to retain data about successful runs of this canary. If you omit this field,
            the default of 31 days is used. The valid range is 1 to 455 days. Defaults to None.
        failure_retention_period_in_days(int, optional): The number of days to retain data about failed runs of this canary. If you omit this field, the
            default of 31 days is used. The valid range is 1 to 455 days. Defaults to None.
        runtime_version(Text): Specifies the runtime version to use for the canary. For a list of valid runtime versions and
            more information about runtime versions, see  Canary Runtime Versions.
        vpc_config(Dict, optional): If this canary is to test an endpoint in a VPC, this structure contains information about the
            subnet and security groups of the VPC endpoint. For more information, see  Running a Canary in a
            VPC. Defaults to None.
        tags(Dict, optional): A list of key-value pairs to associate with the canary. You can associate as many as 50 tags
            with a canary. Tags can help you organize and categorize your resources. You can also use them
            to scope user permissions, by granting a user permission to access or change only the resources
            that have certain tag values. Defaults to None.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

            resource_is_present:
              aws_auto.synthetics.canary.present:
                - name: value
                - code: value
                - artifact_s3_location: value
                - execution_role_arn: value
                - schedule: value
                - runtime_version: value
    '''
    
    result = dict(comment="", changes= None, name=name, result=True)
    ret = await hub.exec.boto3.client.synthetics.canary.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.synthetics.describe_canaries(name)

    if before:
        result["comment"] = f"'{name}' already exists"
    else:
        try:
            ret = await hub.exec.boto3.client.synthetics.create_canary(
                ctx,
                
                
                **{"Name": name, "Code": code, "ArtifactS3Location": artifact_s3_location, "ExecutionRoleArn": execution_role_arn, "Schedule": schedule, "RunConfig": run_config, "SuccessRetentionPeriodInDays": success_retention_period_in_days, "FailureRetentionPeriodInDays": failure_retention_period_in_days, "RuntimeVersion": runtime_version, "VpcConfig": vpc_config, "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.synthetics.describe_canaries(name)
    result["changes"] = differ.deep_diff(before, after)
    return result

async def absent(hub, ctx, name: Text)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Permanently deletes the specified canary. When you delete a canary, resources used and created by the canary are
    not automatically deleted. After you delete a canary that you do not intend to use again, you should also delete
    the following:   The Lambda functions and layers used by this canary. These have the prefix cwsyn-MyCanaryName .
    The CloudWatch alarms created for this canary. These alarms have a name of Synthetics-SharpDrop-Alarm-
    MyCanaryName .   Amazon S3 objects and buckets, such as the canary's artifact location.   IAM roles created for
    the canary. If they were created in the console, these roles have the name  role/service-
    role/CloudWatchSyntheticsRole-MyCanaryName .   CloudWatch Logs log groups created for the canary. These logs
    groups have the name /aws/lambda/cwsyn-MyCanaryName .    Before you delete a canary, you might want to use
    GetCanary to display the information about this canary. Make note of the information returned by this operation
    so that you can delete these resources after you delete the canary.

    Args:
        name(Text): The name of the canary that you want to delete. To find the names of your canaries, use
            DescribeCanaries.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

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

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

