using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
namespace Amazon.Lambda.LexEvents
{
    /// 
    /// This class represents the input event from Amazon Lex. It used as the input parameter
    /// for Lambda functions.
    /// http://docs.aws.amazon.com/lex/latest/dg/lambda-input-response-format.html
    /// 
    public class LexEvent
    {
        /// 
        /// Provides the intent name, slots, and confirmationStatus fields.
        /// 
        public LexCurrentIntent CurrentIntent { get; set; }
        /// 
        /// Provides additional information about a slot value.
        /// 
        public IDictionary SlotDetails { get; set; }
        /// 
        /// The Lex bot invoking the Lambda function
        /// 
        public LexBot Bot { get; set; }
        /// 
        /// This value is provided by the client application. Amazon Lex passes it to the Lambda function.
        /// 
        public string UserId { get; set; }
        /// 
        /// The text used to process the request.
        /// 
        public string InputTranscript { get; set; }
        /// 
        /// To indicate why Amazon Lex is invoking the Lambda function
        /// 
        public string InvocationSource { get; set; }
        /// 
        /// For each user input, the client sends the request to Amazon Lex using one of the runtime API operations, 
        /// PostContent or PostText. From the API request parameters, Amazon Lex determines whether the response 
        /// to the client (user) is text or voice, and sets this field accordingly.
        /// 
        /// The Lambda function can use this information to generate an appropriate message. 
        /// For example, if the client expects a voice response, your Lambda function could return 
        /// Speech Synthesis Markup LanguageSpeech Synthesis Markup Language (SSML) instead of text.
        /// 
        /// 
        public string OutputDialogMode { get; set; }
        /// 
        /// The version of the message that identifies the format of the event data going into the 
        /// Lambda function and the expected format of the response from a Lambda function.
        /// 
        public string MessageVersion { get; set; }
        /// 
        /// Application-specific session attributes that the client sent in the request. If you want 
        /// Amazon Lex to include them in the response to the client, your Lambda function should 
        /// send these back to Amazon Lex in response.
        /// 
        public IDictionary SessionAttributes { get; set; }
        /// 
        /// Request-specific attributes that the client sends in the request. Use request attributes to 
        /// pass information that doesn't need to persist for the entire session.
        /// 
        public IDictionary RequestAttributes { get; set; }
        /// 
        /// A List of alternative intents that are returned when the bot is in advanced mode
        /// 
        public IList AlternativeIntents { get; set; }
        /// 
        /// The result of an Amazon Comprehend sentiment analysis of the last utterance.
        /// 
        public LexSentimentResponseType SentimentResponse { get; set; }
        /// 
        /// If included, sets values for one or more recent intents. You can include information for up to three intents.
        /// 
        public IList RecentIntentSummaryView { get; set; }
        /// 
        /// Gets and sets the property ActiveContexts.
        /// A list of active contexts for the session.A context can be set when an intent is fulfilled or by calling the PostContent, PostText, or PutSession operation.
        /// You can use a context to control the intents that can follow up an intent, or to modify the operation of your application.
        /// 
        public IList ActiveContexts { get; set; }
        /// 
        /// Class representing the sentiment response.
        /// 
        public class LexSentimentResponseType
        {
            /// 
            /// Gets and sets the SentimentLabel
            /// 
            public string SentimentLabel { get; set; }
            /// 
            /// Gets and sets the SentimentScore
            /// 
            public string SentimentScore { get; set; }
        }
        /// 
        /// The class representing the current intent for the Lambda function to process.
        /// 
        public class LexCurrentIntent
        {
            /// 
            /// The intent's name
            /// 
            public string Name { get; set; }
            /// 
            /// List of slots that are configured for the intent and values that are recognized by 
            /// Amazon Lex in the user conversation from the beginning. Otherwise, the values are null.
            /// 
            public IDictionary Slots { get; set; }
            /// 
            /// Provides additional information about a slot value.
            /// 
            public IDictionary SlotDetails { get; set; }
            /// 
            /// Gets and sets the property NluIntentConfidence.
            /// 
            public double? NluIntentConfidenceScore { get; set; }
            /// 
            /// The ConfirmationStatus provides the user response to a confirmation prompt, if there is one. 
            /// 
            public string ConfirmationStatus { get; set; }
        }
        /// 
        /// The class representing the information for a SlotDetail
        /// 
        public class SlotDetail
        {
            /// 
            /// The resolutions array contains a list of additional values recognized for the slot.
            /// 
            public IList> Resolutions { get; set; }
            /// 
            /// The originalValue field contains the value that was entered by the user for the slot.
            /// 
            public string OriginalValue { get; set; }
        }
        /// 
        /// The class identifies the Lex bot that is invoking the Lambda function.
        /// 
        public class LexBot
        {
            /// 
            /// The name of the Lex bot
            /// 
            public string Name { get; set; }
            /// 
            /// The alias of the Lex bot
            /// 
            public string Alias { get; set; }
            /// 
            /// The version of the Lex bot
            /// 
            public string Version { get; set; }
        }
    }
}