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

hub.exec.boto3.client.lightsail.create_container_service
hub.exec.boto3.client.lightsail.delete_container_service
hub.exec.boto3.client.lightsail.get_container_services
hub.exec.boto3.client.lightsail.update_container_service
"""



from typing import *
import dict_tools.differ as differ
async def present(hub, ctx, name: Text, service_name: Text, power: Text, scale: int, tags: List = None, public_domain_names: Dict = None, deployment: Dict = None)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Creates an Amazon Lightsail container service. A Lightsail container service is a compute resource to which you
    can deploy containers. For more information, see Container services in Amazon Lightsail in the Lightsail Dev
    Guide.

    Args:
        name(Text): A name, ID, or JMES search path to identify the resource.
        service_name(Text): The name for the container service. The name that you specify for your container service will
            make up part of its default domain. The default domain of a container service is typically
            https://<ServiceName>.<RandomGUID>.<AWSRegion>.cs.amazonlightsail.com. If the name of your
            container service is container-service-1, and it's located in the US East (Ohio) AWS region (us-
            east-2), then the domain for your container service will be like the following example:
            https://container-service-1.ur4EXAMPLE2uq.us-east-2.cs.amazonlightsail.com  The following are
            the requirements for container service names:   Must be unique within each AWS Region in your
            Lightsail account.   Must contain 1 to 63 characters.   Must contain only alphanumeric
            characters and hyphens.   A hyphen (-) can separate words but cannot be at the start or end of
            the name.
        power(Text): The power specification for the container service. The power specifies the amount of memory,
            vCPUs, and base monthly cost of each node of the container service. The power and scale of a
            container service makes up its configured capacity. To determine the monthly price of your
            container service, multiply the base price of the power with the scale (the number of nodes) of
            the service. Use the GetContainerServicePowers action to get a list of power options that you
            can specify using this parameter, and their base monthly cost.
        scale(int): The scale specification for the container service. The scale specifies the allocated compute
            nodes of the container service. The power and scale of a container service makes up its
            configured capacity. To determine the monthly price of your container service, multiply the base
            price of the power with the scale (the number of nodes) of the service.
        tags(List, optional): The tag keys and optional values to add to the certificate during create. Use the TagResource
            action to tag a resource after it's created. For more information about tags in Lightsail, see
            the Amazon Lightsail Developer Guide. Defaults to None.
        public_domain_names(Dict, optional): The public domain names to use with the container service, such as example.com and
            www.example.com. You can specify up to four public domain names for a container service. The
            domain names that you specify are used when you create a deployment with a container configured
            as the public endpoint of your container service. If you don't specify public domain names, then
            you can use the default domain of the container service.  You must create and validate an
            SSL/TLS certificate before you can use public domain names with your container service. Use the
            CreateCertificate action to create a certificate for the public domain names you want to use
            with your container service.  You can specify public domain names using a string to array map as
            shown in the example later on this page. Defaults to None.
        deployment(Dict, optional): An object that describes a deployment for the container service. A deployment specifies the
            containers that will be launched on the container service and their settings, such as the ports
            to open, the environment variables to apply, and the launch command to run. It also specifies
            the container that will serve as the public endpoint of the deployment and its settings, such as
            the HTTP or HTTPS port to use, and the health check configuration. Defaults to None.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

            resource_is_present:
              aws_auto.lightsail.container_service.present:
                - name: value
                - service_name: value
                - power: value
                - scale: value
    '''
    
    result = dict(comment="", changes= None, name=name, result=True)
    ret = await hub.exec.boto3.client.lightsail.container_service.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.lightsail.get_container_services(name)

    if before:
        result["comment"] = f"'{name}' already exists"
    else:
        try:
            ret = await hub.exec.boto3.client.lightsail.create_container_service(
                ctx,
                
                
                **{"serviceName": service_name, "power": power, "scale": scale, "tags": tags, "publicDomainNames": public_domain_names, "deployment": deployment}
            )
            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.lightsail.get_container_services(name)
    result["changes"] = differ.deep_diff(before, after)
    return result

async def absent(hub, ctx, name: Text, service_name: Text)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Deletes your Amazon Lightsail container service.

    Args:
        name(Text): A name, ID, or JMES search path to identify the resource.
        service_name(Text): The name of the container service to delete.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

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

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

