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

hub.exec.boto3.client.lex_runtime.delete_session
hub.exec.boto3.client.lex_runtime.get_session
hub.exec.boto3.client.lex_runtime.put_session
"""



from typing import *
import dict_tools.differ as differ
async def present(hub, ctx, name: Text, bot_name: Text, bot_alias: Text, user_id: Text, session_attributes: Dict = None, dialog_action: Dict = None, recent_intent_summary_view: List = None, accept: Text = None, active_contexts: List = None)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Creates a new session or modifies an existing session with an Amazon Lex bot. Use this operation to enable your
    application to set the state of the bot. For more information, see Managing Sessions.

    Args:
        name(Text): A name, ID, or JMES search path to identify the resource.
        bot_name(Text): The name of the bot that contains the session data.
        bot_alias(Text): The alias in use for the bot that contains the session data.
        user_id(Text): The ID of the client application user. Amazon Lex uses this to identify a user's conversation
            with your bot.
        session_attributes(Dict, optional): Map of key/value pairs representing the session-specific context information. It contains
            application information passed between Amazon Lex and a client application. Defaults to None.
        dialog_action(Dict, optional): Sets the next action that the bot should take to fulfill the conversation. Defaults to None.
        recent_intent_summary_view(List, optional): A summary of the recent intents for the bot. You can use the intent summary view to set a
            checkpoint label on an intent and modify attributes of intents. You can also use it to remove or
            add intent summary objects to the list. An intent that you modify or add to the list must make
            sense for the bot. For example, the intent name must be valid for the bot. You must provide
            valid values for:    intentName    slot names    slotToElict    If you send the
            recentIntentSummaryView parameter in a PutSession request, the contents of the new summary view
            replaces the old summary view. For example, if a GetSession request returns three intents in the
            summary view and you call PutSession with one intent in the summary view, the next call to
            GetSession will only return one intent. Defaults to None.
        accept(Text, optional): The message that Amazon Lex returns in the response can be either text or speech based depending
            on the value of this field.   If the value is text/plain; charset=utf-8, Amazon Lex returns text
            in the response.   If the value begins with audio/, Amazon Lex returns speech in the response.
            Amazon Lex uses Amazon Polly to generate the speech in the configuration that you specify. For
            example, if you specify audio/mpeg as the value, Amazon Lex returns speech in the MPEG format.
            If the value is audio/pcm, the speech is returned as audio/pcm in 16-bit, little endian format.
            The following are the accepted values:    audio/mpeg     audio/ogg     audio/pcm     audio/*
            (defaults to mpeg)    text/plain; charset=utf-8. Defaults to None.
        active_contexts(List, optional): A list of contexts active for the request. A context can be activated when a previous intent is
            fulfilled, or by including the context in the request, If you don't specify a list of contexts,
            Amazon Lex will use the current list of contexts for the session. If you specify an empty list,
            all contexts for the session are cleared. Defaults to None.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

            resource_is_present:
              aws_auto.lex_runtime.session.present:
                - name: value
                - bot_name: value
                - bot_alias: value
                - user_id: value
    '''
    
    result = dict(comment="", changes= None, name=name, result=True)
    ret = await hub.exec.boto3.client.lex_runtime.session.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.lex_runtime.get_session(name)

    if before:
        result["comment"] = f"'{name}' already exists"
    else:
        try:
            ret = await hub.exec.boto3.client.lex_runtime.put_session(
                ctx,
                
                
                **{"botName": bot_name, "botAlias": bot_alias, "userId": user_id, "sessionAttributes": session_attributes, "dialogAction": dialog_action, "recentIntentSummaryView": recent_intent_summary_view, "accept": accept, "activeContexts": active_contexts}
            )
            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.lex_runtime.get_session(name)
    result["changes"] = differ.deep_diff(before, after)
    return result

async def absent(hub, ctx, name: Text, bot_name: Text, bot_alias: Text, user_id: Text)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Removes session information for a specified bot, alias, and user ID.

    Args:
        name(Text): A name, ID, or JMES search path to identify the resource.
        bot_name(Text): The name of the bot that contains the session data.
        bot_alias(Text): The alias in use for the bot that contains the session data.
        user_id(Text): The identifier of the user associated with the session data.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

            resource_is_absent:
              aws_auto.lex_runtime.session.absent:
                - name: value
                - bot_name: value
                - bot_alias: value
                - user_id: value
    '''
    
    result = dict(comment="", changes= None, name=name, result=True)
    ret = await hub.exec.boto3.client.lex_runtime.session.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.lex_runtime.get_session(name)

    if not before:
        result["comment"] = f"'{name}' already absent"
    else:
        try:
            ret = await hub.exec.boto3.client.lex_runtime.delete_session(
                ctx,
                
                
                **{"botName": bot_name, "botAlias": bot_alias, "userId": user_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.lex_runtime.get_session(name)
    result["changes"] = differ.deep_diff(before, after)
    return result

