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

package mturk

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/mturk/types"
	"github.com/aws/smithy-go/middleware"
	smithyhttp "github.com/aws/smithy-go/transport/http"
)

// The UpdateQualificationType operation modifies the attributes of an existing
// Qualification type, which is represented by a QualificationType data structure.
// Only the owner of a Qualification type can modify its attributes. Most
// attributes of a Qualification type can be changed after the type has been
// created. However, the Name and Keywords fields cannot be modified. The
// RetryDelayInSeconds parameter can be modified or added to change the delay or to
// enable retries, but RetryDelayInSeconds cannot be used to disable retries. You
// can use this operation to update the test for a Qualification type. The test is
// updated based on the values specified for the Test, TestDurationInSeconds and
// AnswerKey parameters. All three parameters specify the updated test. If you are
// updating the test for a type, you must specify the Test and
// TestDurationInSeconds parameters. The AnswerKey parameter is optional; omitting
// it specifies that the updated test does not have an answer key. If you omit the
// Test parameter, the test for the Qualification type is unchanged. There is no
// way to remove a test from a Qualification type that has one. If the type already
// has a test, you cannot update it to be AutoGranted. If the Qualification type
// does not have a test and one is provided by an update, the type will henceforth
// have a test. If you want to update the test duration or answer key for an
// existing test without changing the questions, you must specify a Test parameter
// with the original questions, along with the updated values. If you provide an
// updated Test but no AnswerKey, the new test will not have an answer key.
// Requests for such Qualifications must be granted manually. You can also update
// the AutoGranted and AutoGrantedValue attributes of the Qualification type.
func (c *Client) UpdateQualificationType(ctx context.Context, params *UpdateQualificationTypeInput, optFns ...func(*Options)) (*UpdateQualificationTypeOutput, error) {
	if params == nil {
		params = &UpdateQualificationTypeInput{}
	}

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

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

type UpdateQualificationTypeInput struct {

	// The ID of the Qualification type to update.
	//
	// This member is required.
	QualificationTypeId *string

	// The answers to the Qualification test specified in the Test parameter, in the
	// form of an AnswerKey data structure.
	AnswerKey *string

	// Specifies whether requests for the Qualification type are granted immediately,
	// without prompting the Worker with a Qualification test. Constraints: If the Test
	// parameter is specified, this parameter cannot be true.
	AutoGranted *bool

	// The Qualification value to use for automatically granted Qualifications. This
	// parameter is used only if the AutoGranted parameter is true.
	AutoGrantedValue *int32

	// The new description of the Qualification type.
	Description *string

	// The new status of the Qualification type - Active | Inactive
	QualificationTypeStatus types.QualificationTypeStatus

	// The amount of time, in seconds, that Workers must wait after requesting a
	// Qualification of the specified Qualification type before they can retry the
	// Qualification request. It is not possible to disable retries for a Qualification
	// type after it has been created with retries enabled. If you want to disable
	// retries, you must dispose of the existing retry-enabled Qualification type using
	// DisposeQualificationType and then create a new Qualification type with retries
	// disabled using CreateQualificationType.
	RetryDelayInSeconds *int64

	// The questions for the Qualification test a Worker must answer correctly to
	// obtain a Qualification of this type. If this parameter is specified,
	// TestDurationInSeconds must also be specified. Constraints: Must not be longer
	// than 65535 bytes. Must be a QuestionForm data structure. This parameter cannot
	// be specified if AutoGranted is true. Constraints: None. If not specified, the
	// Worker may request the Qualification without answering any questions.
	Test *string

	// The number of seconds the Worker has to complete the Qualification test,
	// starting from the time the Worker requests the Qualification.
	TestDurationInSeconds *int64

	noSmithyDocumentSerde
}

type UpdateQualificationTypeOutput struct {

	// Contains a QualificationType data structure.
	QualificationType *types.QualificationType

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

	noSmithyDocumentSerde
}

func (c *Client) addOperationUpdateQualificationTypeMiddlewares(stack *middleware.Stack, options Options) (err error) {
	err = stack.Serialize.Add(&awsAwsjson11_serializeOpUpdateQualificationType{}, middleware.After)
	if err != nil {
		return err
	}
	err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpUpdateQualificationType{}, 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, options); err != nil {
		return err
	}
	if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {
		return err
	}
	if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {
		return err
	}
	if err = addOpUpdateQualificationTypeValidationMiddleware(stack); err != nil {
		return err
	}
	if err = stack.Initialize.Add(newServiceMetadataMiddleware_opUpdateQualificationType(options.Region), middleware.Before); err != nil {
		return err
	}
	if err = awsmiddleware.AddRecursionDetection(stack); 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_opUpdateQualificationType(region string) *awsmiddleware.RegisterServiceMetadata {
	return &awsmiddleware.RegisterServiceMetadata{
		Region:        region,
		ServiceID:     ServiceID,
		SigningName:   "mturk-requester",
		OperationName: "UpdateQualificationType",
	}
}