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

hub.exec.boto3.client.servicecatalog.create_constraint
hub.exec.boto3.client.servicecatalog.delete_constraint
hub.exec.boto3.client.servicecatalog.describe_constraint
hub.exec.boto3.client.servicecatalog.update_constraint
"""



from typing import *
import dict_tools.differ as differ
async def present(hub, ctx, name: Text, portfolio_id: Text, product_id: Text, parameters: Text, type_: Text, idempotency_token: Text, accept_language: Text = None, description: Text = None)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Creates a constraint. A delegated admin is authorized to invoke this command.

    Args:
        name(Text): A name, ID, or JMES search path to identify the resource.
        accept_language(Text, optional): The language code.    en - English (default)    jp - Japanese    zh - Chinese. Defaults to None.
        portfolio_id(Text): The portfolio identifier.
        product_id(Text): The product identifier.
        parameters(Text): The constraint parameters, in JSON format. The syntax depends on the constraint type as follows:
            LAUNCH  You are required to specify either the RoleArn or the LocalRoleName but can't use both.
            Specify the RoleArn property as follows:  {"RoleArn" :
            "arn:aws:iam::123456789012:role/LaunchRole"}  Specify the LocalRoleName property as follows:
            {"LocalRoleName": "SCBasicLaunchRole"}  If you specify the LocalRoleName property, when an
            account uses the launch constraint, the IAM role with that name in the account will be used.
            This allows launch-role constraints to be account-agnostic so the administrator can create fewer
            resources per shared account.  The given role name must exist in the account used to create the
            launch constraint and the account of the user who launches a product with this launch
            constraint.  You cannot have both a LAUNCH and a STACKSET constraint. You also cannot have more
            than one LAUNCH constraint on a product and portfolio.  NOTIFICATION  Specify the
            NotificationArns property as follows:  {"NotificationArns" : ["arn:aws:sns:us-
            east-1:123456789012:Topic"]}   RESOURCE_UPDATE  Specify the TagUpdatesOnProvisionedProduct
            property as follows:  {"Version":"2.0","Properties":{"TagUpdateOnProvisionedProduct":"String"}}
            The TagUpdatesOnProvisionedProduct property accepts a string value of ALLOWED or NOT_ALLOWED.
            STACKSET  Specify the Parameters property as follows:  {"Version": "String", "Properties":
            {"AccountList": [ "String" ], "RegionList": [ "String" ], "AdminRole": "String",
            "ExecutionRole": "String"}}  You cannot have both a LAUNCH and a STACKSET constraint. You also
            cannot have more than one STACKSET constraint on a product and portfolio. Products with a
            STACKSET constraint will launch an AWS CloudFormation stack set.  TEMPLATE  Specify the Rules
            property. For more information, see Template Constraint Rules.
        type_(Text): The type of constraint.    LAUNCH     NOTIFICATION     RESOURCE_UPDATE     STACKSET     TEMPLATE.
        description(Text, optional): The description of the constraint. Defaults to None.
        idempotency_token(Text): A unique identifier that you provide to ensure idempotency. If multiple requests differ only by
            the idempotency token, the same response is returned for each repeated request.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

            resource_is_present:
              aws_auto.servicecatalog.constraint.present:
                - name: value
                - portfolio_id: value
                - product_id: value
                - parameters: value
                - type_: value
                - idempotency_token: value
    '''
    
    result = dict(comment="", changes= None, name=name, result=True)
    ret = await hub.exec.boto3.client.servicecatalog.constraint.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.servicecatalog.describe_constraint(name)

    if before:
        result["comment"] = f"'{name}' already exists"
    else:
        try:
            ret = await hub.exec.boto3.client.servicecatalog.create_constraint(
                ctx,
                
                
                **{"AcceptLanguage": accept_language, "PortfolioId": portfolio_id, "ProductId": product_id, "Parameters": parameters, "Type": type_, "Description": description, "IdempotencyToken": idempotency_token}
            )
            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.servicecatalog.describe_constraint(name)
    result["changes"] = differ.deep_diff(before, after)
    return result

async def absent(hub, ctx, name: Text, id_: Text, accept_language: Text = None)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Deletes the specified constraint. A delegated admin is authorized to invoke this command.

    Args:
        name(Text): A name, ID, or JMES search path to identify the resource.
        accept_language(Text, optional): The language code.    en - English (default)    jp - Japanese    zh - Chinese. Defaults to None.
        id_(Text): The identifier of the constraint.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

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

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

