// Code generated by smithy-go-codegen DO NOT EDIT.

package lexmodelbuildingservice

import (
	"context"
	awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware"
	"github.com/aws/aws-sdk-go-v2/aws/signer/v4"
	"github.com/aws/aws-sdk-go-v2/service/lexmodelbuildingservice/types"
	"github.com/aws/smithy-go/middleware"
	smithyhttp "github.com/aws/smithy-go/transport/http"
	"time"
)

// Creates an Amazon Lex conversational bot or replaces an existing bot. When you
// create or update a bot you are only required to specify a name, a locale, and
// whether the bot is directed toward children under age 13. You can use this to
// add intents later, or to remove intents from an existing bot. When you create a
// bot with the minimum information, the bot is created or updated but Amazon Lex
// returns the  response FAILED. You can build the bot after you add one or more
// intents. For more information about Amazon Lex bots, see how-it-works. If you
// specify the name of an existing bot, the fields in the request replace the
// existing values in the $LATEST version of the bot. Amazon Lex removes any fields
// that you don't provide values for in the request, except for the
// idleTTLInSeconds and privacySettings fields, which are set to their default
// values. If you don't specify values for required fields, Amazon Lex throws an
// exception. This operation requires permissions for the lex:PutBot action. For
// more information, see security-iam.
func (c *Client) PutBot(ctx context.Context, params *PutBotInput, optFns ...func(*Options)) (*PutBotOutput, error) {
	if params == nil {
		params = &PutBotInput{}
	}

	result, metadata, err := c.invokeOperation(ctx, "PutBot", params, optFns, c.addOperationPutBotMiddlewares)
	if err != nil {
		return nil, err
	}

	out := result.(*PutBotOutput)
	out.ResultMetadata = metadata
	return out, nil
}

type PutBotInput struct {

	// For each Amazon Lex bot created with the Amazon Lex Model Building Service, you
	// must specify whether your use of Amazon Lex is related to a website, program, or
	// other application that is directed or targeted, in whole or in part, to children
	// under age 13 and subject to the Children's Online Privacy Protection Act (COPPA)
	// by specifying true or false in the childDirected field. By specifying true in
	// the childDirected field, you confirm that your use of Amazon Lex is related to a
	// website, program, or other application that is directed or targeted, in whole or
	// in part, to children under age 13 and subject to COPPA. By specifying false in
	// the childDirected field, you confirm that your use of Amazon Lex is not related
	// to a website, program, or other application that is directed or targeted, in
	// whole or in part, to children under age 13 and subject to COPPA. You may not
	// specify a default value for the childDirected field that does not accurately
	// reflect whether your use of Amazon Lex is related to a website, program, or
	// other application that is directed or targeted, in whole or in part, to children
	// under age 13 and subject to COPPA. If your use of Amazon Lex relates to a
	// website, program, or other application that is directed in whole or in part, to
	// children under age 13, you must obtain any required verifiable parental consent
	// under COPPA. For information regarding the use of Amazon Lex in connection with
	// websites, programs, or other applications that are directed or targeted, in
	// whole or in part, to children under age 13, see the Amazon Lex FAQ.
	// (https://aws.amazon.com/lex/faqs#data-security)
	//
	// This member is required.
	ChildDirected *bool

	// Specifies the target locale for the bot. Any intent used in the bot must be
	// compatible with the locale of the bot. The default is en-US.
	//
	// This member is required.
	Locale types.Locale

	// The name of the bot. The name is not case sensitive.
	//
	// This member is required.
	Name *string

	// When Amazon Lex can't understand the user's input in context, it tries to elicit
	// the information a few times. After that, Amazon Lex sends the message defined in
	// abortStatement to the user, and then cancels the conversation. To set the number
	// of retries, use the valueElicitationPrompt field for the slot type. For example,
	// in a pizza ordering bot, Amazon Lex might ask a user "What type of crust would
	// you like?" If the user's response is not one of the expected responses (for
	// example, "thin crust, "deep dish," etc.), Amazon Lex tries to elicit a correct
	// response a few more times. For example, in a pizza ordering application,
	// OrderPizza might be one of the intents. This intent might require the CrustType
	// slot. You specify the valueElicitationPrompt field when you create the CrustType
	// slot. If you have defined a fallback intent the cancel statement will not be
	// sent to the user, the fallback intent is used instead. For more information, see
	// AMAZON.FallbackIntent
	// (https://docs.aws.amazon.com/lex/latest/dg/built-in-intent-fallback.html).
	AbortStatement *types.Statement

	// Identifies a specific revision of the $LATEST version. When you create a new
	// bot, leave the checksum field blank. If you specify a checksum you get a
	// BadRequestException exception. When you want to update a bot, set the checksum
	// field to the checksum of the most recent revision of the $LATEST version. If you
	// don't specify the  checksum field, or if the checksum does not match the $LATEST
	// version, you get a PreconditionFailedException exception.
	Checksum *string

	// When Amazon Lex doesn't understand the user's intent, it uses this message to
	// get clarification. To specify how many times Amazon Lex should repeat the
	// clarification prompt, use the maxAttempts field. If Amazon Lex still doesn't
	// understand, it sends the message in the abortStatement field. When you create a
	// clarification prompt, make sure that it suggests the correct response from the
	// user. for example, for a bot that orders pizza and drinks, you might create this
	// clarification prompt: "What would you like to do? You can say 'Order a pizza' or
	// 'Order a drink.'" If you have defined a fallback intent, it will be invoked if
	// the clarification prompt is repeated the number of times defined in the
	// maxAttempts field. For more information, see  AMAZON.FallbackIntent
	// (https://docs.aws.amazon.com/lex/latest/dg/built-in-intent-fallback.html). If
	// you don't define a clarification prompt, at runtime Amazon Lex will return a 400
	// Bad Request exception in three cases:
	//
	// * Follow-up prompt - When the user
	// responds to a follow-up prompt but does not provide an intent. For example, in
	// response to a follow-up prompt that says "Would you like anything else today?"
	// the user says "Yes." Amazon Lex will return a 400 Bad Request exception because
	// it does not have a clarification prompt to send to the user to get an intent.
	//
	// *
	// Lambda function - When using a Lambda function, you return an ElicitIntent
	// dialog type. Since Amazon Lex does not have a clarification prompt to get an
	// intent from the user, it returns a 400 Bad Request exception.
	//
	// * PutSession
	// operation - When using the PutSession operation, you send an ElicitIntent dialog
	// type. Since Amazon Lex does not have a clarification prompt to get an intent
	// from the user, it returns a 400 Bad Request exception.
	ClarificationPrompt *types.Prompt

	// When set to true a new numbered version of the bot is created. This is the same
	// as calling the CreateBotVersion operation. If you don't specify createVersion,
	// the default is false.
	CreateVersion *bool

	// A description of the bot.
	Description *string

	// When set to true user utterances are sent to Amazon Comprehend for sentiment
	// analysis. If you don't specify detectSentiment, the default is false.
	DetectSentiment *bool

	// Set to true to enable access to natural language understanding improvements.
	// When you set the enableModelImprovements parameter to true you can use the
	// nluIntentConfidenceThreshold parameter to configure confidence scores. For more
	// information, see Confidence Scores
	// (https://docs.aws.amazon.com/lex/latest/dg/confidence-scores.html). You can only
	// set the enableModelImprovements parameter in certain Regions. If you set the
	// parameter to true, your bot has access to accuracy improvements. The Regions
	// where you can set the enableModelImprovements parameter to true are:
	//
	// * US East
	// (N. Virginia) (us-east-1)
	//
	// * US West (Oregon) (us-west-2)
	//
	// * Asia Pacific
	// (Sydney) (ap-southeast-2)
	//
	// * EU (Ireland) (eu-west-1)
	//
	// In other Regions, the
	// enableModelImprovements parameter is set to true by default. In these Regions
	// setting the parameter to false throws a ValidationException exception.
	EnableModelImprovements *bool

	// The maximum time in seconds that Amazon Lex retains the data gathered in a
	// conversation. A user interaction session remains active for the amount of time
	// specified. If no conversation occurs during this time, the session expires and
	// Amazon Lex deletes any data provided before the timeout. For example, suppose
	// that a user chooses the OrderPizza intent, but gets sidetracked halfway through
	// placing an order. If the user doesn't complete the order within the specified
	// time, Amazon Lex discards the slot information that it gathered, and the user
	// must start over. If you don't include the idleSessionTTLInSeconds element in a
	// PutBot operation request, Amazon Lex uses the default value. This is also true
	// if the request replaces an existing bot. The default is 300 seconds (5 minutes).
	IdleSessionTTLInSeconds *int32

	// An array of Intent objects. Each intent represents a command that a user can
	// express. For example, a pizza ordering bot might support an OrderPizza intent.
	// For more information, see how-it-works.
	Intents []types.Intent

	// Determines the threshold where Amazon Lex will insert the AMAZON.FallbackIntent,
	// AMAZON.KendraSearchIntent, or both when returning alternative intents in a
	// PostContent
	// (https://docs.aws.amazon.com/lex/latest/dg/API_runtime_PostContent.html) or
	// PostText (https://docs.aws.amazon.com/lex/latest/dg/API_runtime_PostText.html)
	// response. AMAZON.FallbackIntent and AMAZON.KendraSearchIntent are only inserted
	// if they are configured for the bot. You must set the enableModelImprovements
	// parameter to true to use confidence scores in the following regions.
	//
	// * US East
	// (N. Virginia) (us-east-1)
	//
	// * US West (Oregon) (us-west-2)
	//
	// * Asia Pacific
	// (Sydney) (ap-southeast-2)
	//
	// * EU (Ireland) (eu-west-1)
	//
	// In other Regions, the
	// enableModelImprovements parameter is set to true by default. For example,
	// suppose a bot is configured with the confidence threshold of 0.80 and the
	// AMAZON.FallbackIntent. Amazon Lex returns three alternative intents with the
	// following confidence scores: IntentA (0.70), IntentB (0.60), IntentC (0.50). The
	// response from the PostText operation would be:
	//
	// * AMAZON.FallbackIntent
	//
	// *
	// IntentA
	//
	// * IntentB
	//
	// * IntentC
	NluIntentConfidenceThreshold *float64

	// If you set the processBehavior element to BUILD, Amazon Lex builds the bot so
	// that it can be run. If you set the element to SAVE Amazon Lex saves the bot, but
	// doesn't build it. If you don't specify this value, the default value is BUILD.
	ProcessBehavior types.ProcessBehavior

	// A list of tags to add to the bot. You can only add tags when you create a bot,
	// you can't use the PutBot operation to update the tags on a bot. To update tags,
	// use the TagResource operation.
	Tags []types.Tag

	// The Amazon Polly voice ID that you want Amazon Lex to use for voice interactions
	// with the user. The locale configured for the voice must match the locale of the
	// bot. For more information, see Voices in Amazon Polly
	// (https://docs.aws.amazon.com/polly/latest/dg/voicelist.html) in the Amazon Polly
	// Developer Guide.
	VoiceId *string

	noSmithyDocumentSerde
}

type PutBotOutput struct {

	// The message that Amazon Lex uses to cancel a conversation. For more information,
	// see PutBot.
	AbortStatement *types.Statement

	// Checksum of the bot that you created.
	Checksum *string

	// For each Amazon Lex bot created with the Amazon Lex Model Building Service, you
	// must specify whether your use of Amazon Lex is related to a website, program, or
	// other application that is directed or targeted, in whole or in part, to children
	// under age 13 and subject to the Children's Online Privacy Protection Act (COPPA)
	// by specifying true or false in the childDirected field. By specifying true in
	// the childDirected field, you confirm that your use of Amazon Lex is related to a
	// website, program, or other application that is directed or targeted, in whole or
	// in part, to children under age 13 and subject to COPPA. By specifying false in
	// the childDirected field, you confirm that your use of Amazon Lex is not related
	// to a website, program, or other application that is directed or targeted, in
	// whole or in part, to children under age 13 and subject to COPPA. You may not
	// specify a default value for the childDirected field that does not accurately
	// reflect whether your use of Amazon Lex is related to a website, program, or
	// other application that is directed or targeted, in whole or in part, to children
	// under age 13 and subject to COPPA. If your use of Amazon Lex relates to a
	// website, program, or other application that is directed in whole or in part, to
	// children under age 13, you must obtain any required verifiable parental consent
	// under COPPA. For information regarding the use of Amazon Lex in connection with
	// websites, programs, or other applications that are directed or targeted, in
	// whole or in part, to children under age 13, see the Amazon Lex FAQ.
	// (https://aws.amazon.com/lex/faqs#data-security)
	ChildDirected *bool

	// The prompts that Amazon Lex uses when it doesn't understand the user's intent.
	// For more information, see PutBot.
	ClarificationPrompt *types.Prompt

	// True if a new version of the bot was created. If the createVersion field was not
	// specified in the request, the createVersion field is set to false in the
	// response.
	CreateVersion *bool

	// The date that the bot was created.
	CreatedDate *time.Time

	// A description of the bot.
	Description *string

	// true if the bot is configured to send user utterances to Amazon Comprehend for
	// sentiment analysis. If the detectSentiment field was not specified in the
	// request, the detectSentiment field is false in the response.
	DetectSentiment *bool

	// Indicates whether the bot uses accuracy improvements. true indicates that the
	// bot is using the improvements, otherwise, false.
	EnableModelImprovements *bool

	// If status is FAILED, Amazon Lex provides the reason that it failed to build the
	// bot.
	FailureReason *string

	// The maximum length of time that Amazon Lex retains the data gathered in a
	// conversation. For more information, see PutBot.
	IdleSessionTTLInSeconds *int32

	// An array of Intent objects. For more information, see PutBot.
	Intents []types.Intent

	// The date that the bot was updated. When you create a resource, the creation date
	// and last updated date are the same.
	LastUpdatedDate *time.Time

	// The target locale for the bot.
	Locale types.Locale

	// The name of the bot.
	Name *string

	// The score that determines where Amazon Lex inserts the AMAZON.FallbackIntent,
	// AMAZON.KendraSearchIntent, or both when returning alternative intents in a
	// PostContent
	// (https://docs.aws.amazon.com/lex/latest/dg/API_runtime_PostContent.html) or
	// PostText (https://docs.aws.amazon.com/lex/latest/dg/API_runtime_PostText.html)
	// response. AMAZON.FallbackIntent is inserted if the confidence score for all
	// intents is below this value. AMAZON.KendraSearchIntent is only inserted if it is
	// configured for the bot.
	NluIntentConfidenceThreshold *float64

	// When you send a request to create a bot with processBehavior set to BUILD,
	// Amazon Lex sets the status response element to BUILDING. In the
	// READY_BASIC_TESTING state you can test the bot with user inputs that exactly
	// match the utterances configured for the bot's intents and values in the slot
	// types. If Amazon Lex can't build the bot, Amazon Lex sets status to FAILED.
	// Amazon Lex returns the reason for the failure in the failureReason response
	// element. When you set processBehavior to SAVE, Amazon Lex sets the status code
	// to NOT BUILT. When the bot is in the READY state you can test and publish the
	// bot.
	Status types.Status

	// A list of tags associated with the bot.
	Tags []types.Tag

	// The version of the bot. For a new bot, the version is always $LATEST.
	Version *string

	// The Amazon Polly voice ID that Amazon Lex uses for voice interaction with the
	// user. For more information, see PutBot.
	VoiceId *string

	// Metadata pertaining to the operation's result.
	ResultMetadata middleware.Metadata

	noSmithyDocumentSerde
}

func (c *Client) addOperationPutBotMiddlewares(stack *middleware.Stack, options Options) (err error) {
	err = stack.Serialize.Add(&awsRestjson1_serializeOpPutBot{}, middleware.After)
	if err != nil {
		return err
	}
	err = stack.Deserialize.Add(&awsRestjson1_deserializeOpPutBot{}, middleware.After)
	if err != nil {
		return err
	}
	if err = addSetLoggerMiddleware(stack, options); err != nil {
		return err
	}
	if err = awsmiddleware.AddClientRequestIDMiddleware(stack); err != nil {
		return err
	}
	if err = smithyhttp.AddComputeContentLengthMiddleware(stack); err != nil {
		return err
	}
	if err = addResolveEndpointMiddleware(stack, options); err != nil {
		return err
	}
	if err = v4.AddComputePayloadSHA256Middleware(stack); err != nil {
		return err
	}
	if err = addRetryMiddlewares(stack, options); err != nil {
		return err
	}
	if err = addHTTPSignerV4Middleware(stack, options); err != nil {
		return err
	}
	if err = awsmiddleware.AddRawResponseToMetadata(stack); err != nil {
		return err
	}
	if err = awsmiddleware.AddRecordResponseTiming(stack); err != nil {
		return err
	}
	if err = addClientUserAgent(stack); err != nil {
		return err
	}
	if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {
		return err
	}
	if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {
		return err
	}
	if err = addOpPutBotValidationMiddleware(stack); err != nil {
		return err
	}
	if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutBot(options.Region), middleware.Before); err != nil {
		return err
	}
	if err = addRequestIDRetrieverMiddleware(stack); err != nil {
		return err
	}
	if err = addResponseErrorMiddleware(stack); err != nil {
		return err
	}
	if err = addRequestResponseLogging(stack, options); err != nil {
		return err
	}
	return nil
}

func newServiceMetadataMiddleware_opPutBot(region string) *awsmiddleware.RegisterServiceMetadata {
	return &awsmiddleware.RegisterServiceMetadata{
		Region:        region,
		ServiceID:     ServiceID,
		SigningName:   "lex",
		OperationName: "PutBot",
	}
}
