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

hub.exec.boto3.client.ec2.associate_dhcp_options
hub.exec.boto3.client.ec2.create_dhcp_options
hub.exec.boto3.client.ec2.delete_dhcp_options
hub.exec.boto3.client.ec2.describe_dhcp_options
"""



from typing import *
import dict_tools.differ as differ
async def present(hub, ctx, name: Text, dhcp_configurations: List, tag_specifications: List = None)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Creates a set of DHCP options for your VPC. After creating the set, you must associate it with the VPC, causing
    all existing and new instances that you launch in the VPC to use this set of DHCP options. The following are the
    individual DHCP options you can specify. For more information about the options, see RFC 2132.    domain-name-
    servers - The IP addresses of up to four domain name servers, or AmazonProvidedDNS. The default DHCP option set
    specifies AmazonProvidedDNS. If specifying more than one domain name server, specify the IP addresses in a
    single parameter, separated by commas. To have your instance receive a custom DNS hostname as specified in
    domain-name, you must set domain-name-servers to a custom DNS server.    domain-name - If you're using
    AmazonProvidedDNS in us-east-1, specify ec2.internal. If you're using AmazonProvidedDNS in another Region,
    specify region.compute.internal (for example, ap-northeast-1.compute.internal). Otherwise, specify a domain name
    (for example, ExampleCompany.com). This value is used to complete unqualified DNS hostnames. Important: Some
    Linux operating systems accept multiple domain names separated by spaces. However, Windows and other Linux
    operating systems treat the value as a single domain, which results in unexpected behavior. If your DHCP options
    set is associated with a VPC that has instances with multiple operating systems, specify only one domain name.
    ntp-servers - The IP addresses of up to four Network Time Protocol (NTP) servers.    netbios-name-servers - The
    IP addresses of up to four NetBIOS name servers.    netbios-node-type - The NetBIOS node type (1, 2, 4, or 8).
    We recommend that you specify 2 (broadcast and multicast are not currently supported). For more information
    about these node types, see RFC 2132.   Your VPC automatically starts out with a set of DHCP options that
    includes only a DNS server that we provide (AmazonProvidedDNS). If you create a set of options, and if your VPC
    has an internet gateway, make sure to set the domain-name-servers option either to AmazonProvidedDNS or to a
    domain name server of your choice. For more information, see DHCP options sets in the Amazon Virtual Private
    Cloud User Guide.

    Args:
        name(Text): A name, ID, or JMES search path to identify the resource.
        dhcp_configurations(List): A DHCP configuration option.
        tag_specifications(List, optional): The tags to assign to the DHCP option. Defaults to None.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

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

    if before:
        result["comment"] = f"'{name}' already exists"
    else:
        try:
            ret = await hub.exec.boto3.client.ec2.create_dhcp_options(
                ctx,
                DryRun=ctx.test,
                
                **{"DhcpConfigurations": dhcp_configurations, "TagSpecifications": tag_specifications}
            )
            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.ec2.describe_dhcp_options(name)
    result["changes"] = differ.deep_diff(before, after)
    return result

async def absent(hub, ctx, name: Text, dhcp_options_id: Text)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Deletes the specified set of DHCP options. You must disassociate the set of DHCP options before you can delete
    it. You can disassociate the set of DHCP options by associating either a new set of options or the default set
    of options with the VPC.

    Args:
        name(Text): A name, ID, or JMES search path to identify the resource.
        dhcp_options_id(Text): The ID of the DHCP options set.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

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

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

