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

hub.exec.boto3.client.route53.create_hosted_zone
hub.exec.boto3.client.route53.delete_hosted_zone
hub.exec.boto3.client.route53.get_hosted_zone
hub.exec.boto3.client.route53.list_hosted_zones
"""



from typing import *
import dict_tools.differ as differ
async def present(hub, ctx, name: Text, caller_reference: Text, vpc: Dict = None, hosted_zone_config: Dict = None, delegation_set_id: Text = None)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Creates a new public or private hosted zone. You create records in a public hosted zone to define how you want
    to route traffic on the internet for a domain, such as example.com, and its subdomains (apex.example.com,
    acme.example.com). You create records in a private hosted zone to define how you want to route traffic for a
    domain and its subdomains within one or more Amazon Virtual Private Clouds (Amazon VPCs).   You can't convert a
    public hosted zone to a private hosted zone or vice versa. Instead, you must create a new hosted zone with the
    same name and create new resource record sets.  For more information about charges for hosted zones, see Amazon
    Route 53 Pricing. Note the following:   You can't create a hosted zone for a top-level domain (TLD) such as
    .com.   For public hosted zones, Route 53 automatically creates a default SOA record and four NS records for the
    zone. For more information about SOA and NS records, see NS and SOA Records that Route 53 Creates for a Hosted
    Zone in the Amazon Route 53 Developer Guide. If you want to use the same name servers for multiple public hosted
    zones, you can optionally associate a reusable delegation set with the hosted zone. See the DelegationSetId
    element.   If your domain is registered with a registrar other than Route 53, you must update the name servers
    with your registrar to make Route 53 the DNS service for the domain. For more information, see Migrating DNS
    Service for an Existing Domain to Amazon Route 53 in the Amazon Route 53 Developer Guide.    When you submit a
    CreateHostedZone request, the initial status of the hosted zone is PENDING. For public hosted zones, this means
    that the NS and SOA records are not yet available on all Route 53 DNS servers. When the NS and SOA records are
    available, the status of the zone changes to INSYNC. The CreateHostedZone request requires the caller to have an
    ec2:DescribeVpcs permission.

    Args:
        name(Text): The name of the domain. Specify a fully qualified domain name, for example, www.example.com. The
            trailing dot is optional; Amazon Route 53 assumes that the domain name is fully qualified. This
            means that Route 53 treats www.example.com (without a trailing dot) and www.example.com. (with a
            trailing dot) as identical. If you're creating a public hosted zone, this is the name you have
            registered with your DNS registrar. If your domain name is registered with a registrar other
            than Route 53, change the name servers for your domain to the set of NameServers that
            CreateHostedZone returns in DelegationSet.
        vpc(Dict, optional): (Private hosted zones only) A complex type that contains information about the Amazon VPC that
            you're associating with this hosted zone. You can specify only one Amazon VPC when you create a
            private hosted zone. To associate additional Amazon VPCs with the hosted zone, use
            AssociateVPCWithHostedZone after you create a hosted zone. Defaults to None.
        caller_reference(Text): A unique string that identifies the request and that allows failed CreateHostedZone requests to
            be retried without the risk of executing the operation twice. You must use a unique
            CallerReference string every time you submit a CreateHostedZone request. CallerReference can be
            any unique string, for example, a date/time stamp.
        hosted_zone_config(Dict, optional): (Optional) A complex type that contains the following optional values:   For public and private
            hosted zones, an optional comment   For private hosted zones, an optional PrivateZone element
            If you don't specify a comment or the PrivateZone element, omit HostedZoneConfig and the other
            elements. Defaults to None.
        delegation_set_id(Text, optional): If you want to associate a reusable delegation set with this hosted zone, the ID that Amazon
            Route 53 assigned to the reusable delegation set when you created it. For more information about
            reusable delegation sets, see CreateReusableDelegationSet. Defaults to None.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

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

    if before:
        result["comment"] = f"'{name}' already exists"
    else:
        try:
            ret = await hub.exec.boto3.client.route53.create_hosted_zone(
                ctx,
                
                
                **{"Name": name, "VPC": vpc, "CallerReference": caller_reference, "HostedZoneConfig": hosted_zone_config, "DelegationSetId": delegation_set_id}
            )
            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.route53.get_hosted_zone(name)
    result["changes"] = differ.deep_diff(before, after)
    return result

async def absent(hub, ctx, name: Text, id_: Text)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Deletes a hosted zone. If the hosted zone was created by another service, such as Cloud Map, see Deleting Public
    Hosted Zones That Were Created by Another Service in the Amazon Route 53 Developer Guide for information about
    how to delete it. (The process is the same for public and private hosted zones that were created by another
    service.) If you want to keep your domain registration but you want to stop routing internet traffic to your
    website or web application, we recommend that you delete resource record sets in the hosted zone instead of
    deleting the hosted zone.  If you delete a hosted zone, you can't undelete it. You must create a new hosted zone
    and update the name servers for your domain registration, which can require up to 48 hours to take effect. (If
    you delegated responsibility for a subdomain to a hosted zone and you delete the child hosted zone, you must
    update the name servers in the parent hosted zone.) In addition, if you delete a hosted zone, someone could
    hijack the domain and route traffic to their own resources using your domain name.  If you want to avoid the
    monthly charge for the hosted zone, you can transfer DNS service for the domain to a free DNS service. When you
    transfer DNS service, you have to update the name servers for the domain registration. If the domain is
    registered with Route 53, see UpdateDomainNameservers for information about how to replace Route 53 name servers
    with name servers for the new DNS service. If the domain is registered with another registrar, use the method
    provided by the registrar to update name servers for the domain registration. For more information, perform an
    internet search on "free DNS service." You can delete a hosted zone only if it contains only the default SOA
    record and NS resource record sets. If the hosted zone contains other resource record sets, you must delete them
    before you can delete the hosted zone. If you try to delete a hosted zone that contains other resource record
    sets, the request fails, and Route 53 returns a HostedZoneNotEmpty error. For information about deleting records
    from your hosted zone, see ChangeResourceRecordSets. To verify that the hosted zone has been deleted, do one of
    the following:   Use the GetHostedZone action to request information about the hosted zone.   Use the
    ListHostedZones action to get a list of the hosted zones associated with the current Amazon Web Services
    account.

    Args:
        name(Text): A name, ID, or JMES search path to identify the resource.
        id_(Text): The ID of the hosted zone you want to delete.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

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

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

